2013-02-02 5 views
17

Podczas wyszukiwania pytania związanego z przeniesieniem PHP function to JavaScript. Widziałem, co Przypuszczałem było nieprawidłowe JavaScript:Czy argumenty funkcji obsługują wartość domyślną w JavaScript?

function my_isnum(str, negative=false, decimal=false) 

Potem próbowałem to w JSFiddle:

function my_isnum(str, negative=false, decimal=-2) 
{ 
    console.log(arguments); 
    console.log(str); 
    console.log(negative); 
    console.log(decimal); 
} 
my_isnum("5", "Hi"); 

I ku mojemu zaskoczeniu to jest to, co widzę w konsoli Firebug:

["5", "Hi"] 
5 
Hi 
-2 

Teraz w Chrome jest to, co widzę:

Uncaught SyntaxError: Unexpected token = 

Co nie rozumiem, jest to przykład jakiegoś wczesnego standardu obsługiwanego przez Firefoksa (MDN na function nie wspomina o tym)?

+0

Jestem zaskoczony, że FF też to pokazuje! – Popnoodles

+0

JavaScript Firefoksa jest nadzbiorem ECMAScript 3. Posiada funkcje, które nie są standardową składnią. Wśród nich są tablice, wyrażenia 'let' i destrukturyzacja przypisania. –

Odpowiedz

4

Sortuj. Można zrobić coś takiego:

function the_func(some_val) { 
    // if some_val is not passed to the_func 
    if (typeof some_val == 'undefined') { 
     some_val = 'default_some_val'; 
    } 

    // now you can use some_val in the remaining parts of the method 
} 
+0

może jednak z dwoma mniejszymi liniami. – Popnoodles

+1

I tak wygląda 100% mojego kodu i każdego innego sprawdzania argumentów, jakie widziałem w JavaScript. –

+0

Czy coś takiego jak: some_val = (typeof some_val! == 'undefined')? some_val: 'defaultVal'; – javaBean007

8

odpowiedź Lostsource jest poprawna, przyjść ECMA6, wartości domyślne najprawdopodobniej będą wspierane, myślę, że tak będzie, ale ponieważ nadal jest to roboczy projekt, nie możesz być naprawdę pewien ... Na razie możesz użyć logicznego lub: To działa trochę jak trójkowy. Wyrażenia są rozwiązane, od lewej do prawej: jak najszybciej JS napotka wartość truthy, to co zostanie przypisany:

var someVar = false || undefined || null || 0 || 1; 

przydzieli 1 do someVar. W przypadku braku wartości są przekazywane do funkcji, wszystkie argumenty są przypisane undefined domyślnie, więc w tym przypadku:

myArgument = myArgument || 'default'; 
//is the same as: 
myArgument = undefined || 'default';//evaluates to "default" 

Ale kiedy przechodzą false jako argument lub null lub pusty ciąg znaków, wartość domyślna być przydzielonym, więc bądź ostrożny.
W tych przypadkach lepiej jest dopasować if/ternary (jak widać w odpowiedziJollySin). Potrójny odpowiednik tego:

some_val = typeof some_val === 'undefined' ? 'default' : some_val;