Czemu przekazanie nadmiarowych argumentów nie powodują wyjątków?

0

Czemu jeśli przekazuje wartość undefined jako nieistniejący parametr funkcji to nie jest zwracany błąd ?

const someFunction = (firstArgument) => {
	return firstArgument;
}

const result = someFunction(1, undefined);
console.log(result);
0

a czemu ma zwrócić błąd i jaki? Możesz wywoływać funkcje z dowolną ilością parametrów, brakujące dostaną "wartość" undefined, a nadmiarowe będą zignorowane, dzięki temu w typescript można robić coś w stylu przeciążenia funkcji.
W ogóle nie musisz definiować parametrów, możesz skorzystać z arguments

const someFunction = function() {
  return arguments[0];
}

const result = someFunction(1, 2, 3);
console.log(result);
1

Tak działa JS, dobrze to opisał obscurity, jest to dynamiczny język i na takie rzeczy pozwala, tu masz fajnie opisane co możesz zrobić z parametrami w funkcjach JS: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions#function_parameters

1

Z reguły mamy dwa rodzaje "głównych typów" na jakie możemy podzielić języki: statycznie i dynamicznie typowane (statycznie to np Java, a dynamicznie to np JavaScript), oraz silnie i słabo typowane (silnie to np Python, a słabo typowany to np C). Jest to częsta pomyłka u wielu, czasami mylą statyczne i silne, oraz dynamiczne i słabe; ale w gruncie rzeczy jest to taka tablica 2x2.

JavaScript jest dynamicznie typowany, oraz słabo typowany.

Dynamiczne typowanie, znaczy że typ zmiennej może się zmienić w trakcie działania programu, tzn możesz napisać value = 2 a zaraz potem value = "2". W języku silnie typowanym, jak np Java, takie coś nie przejdzie, bowiem do int value można wpisać tylko liczbę (nawet użycie var nic nie zmienia, bo nawet jak zrobimy var value = 2;, to ta zmienna już jest typu int i nie można do niej wpisać String).

Słabe typowanie oznacza, że język pozwala mieszać typy, dla przykładu w JavaScript można zrobić coś takiego: 2 + "2", da się to również zrobić w innych słabo typowanych językach jak np PHP. Inną cechą języków słabotypowanych jest to, że odczytanie nieistniejących atrybutów nie kończy się błędem, tylko zamiast tego zwracana jest magiczna wartość, jak np undefined lub null. Dlatego Python nie jest słabo typowany, bo 2 + "2" kończy się błędem, jak również odczytanie nieistniejącego klucza z mapy lub dostęp do nieistniejącego elementu w obiekcie kończy się błędem.

Niektóre języki pozwalają na przekazanie nadmiarowych argumentów do funkcji (jak np właśnie JavaScript lub PHP), ale nie wszystkie. Nie znam statycznie typowanego języka który ignorowałby nadmiarowe argumenty; ale jednak są dynamicznie typowane języki które nie pozwalają. Więc to nie jest takie 1:1.

Także to czy język jest dynamicznie typowany czy nie, nie ma specjalnego znaczenia w kontekście tego pytania. To o czym pyta OP nazywa się "arność funkcji" (ang. "function arity"), czyli to że ilośc argumentów musi się zgadzać.

tl;dr;

mielony711 napisał(a):

Czemu jeśli przekazuje wartość undefined jako nieistniejący parametr funkcji to nie jest zwracany błąd ?

Bo po prostu w taki sposób JavaScript został zaprojektowany, że nadmiarowe argumenty nie są traktowane jako błąd.

Jeśli nie podoba Ci się ta cecha tego języka, to zainteresuj się np językiem Python.

1 użytkowników online, w tym zalogowanych: 0, gości: 1