2012-08-12 14 views
5

Weźmy funkcję przykład tutaj:Sprawdzanie parametrów przekazanych korzystających null - JavaScript

function a(b){ 
    console.log(b != null ? 1 : 2); 
} 

Ten kod działa poprawnie, drukując 1 jeśli przekazać parametr i 2, jeśli nie.

Jednak JSLint ostrzega mnie, mówiąc mi, że zamiast tego użyję ścisłych równości, tj. !==. Niezależnie od tego, czy parametr zostanie przekazany, czy nie, funkcja wydrukuje 1, gdy używasz !==.

Moje pytanie brzmi: jaki jest najlepszy sposób sprawdzenia, czy parametr został przekazany? Nie chcę używać arguments.length, ani w rzeczywistości używać obiektu arguments w ogóle.

Próbowałem za pomocą tego:

function a(b){ 
    console.log(typeof(b) !== "undefined" ? 1 : 2); 
} 

^że wydawało się do pracy, ale jest to najlepszy sposób?

+2

Jeśli przekażesz 'undefined', wówczas otrzymasz fałszywy wynik negatywny. 'arguments.length' (lub warianty) to jedyny sposób sprawdzenia, czy argument został przekazany. – Esailija

+0

@Esailija Jeśli nie jest intencją funkcji jawnej pracy z nieokreśloną wartością, powinno to być w porządku imo. Nie jest to funkcja odpowiedzialna za wychwycenie każdego możliwego błędu. – Christoph

+0

@Christoph Jeśli naprawdę potrzebujesz wiedzieć, czy argument został przekazany, to nie jest dobrze. Jeśli chcesz tylko wiedzieć, czy argument jest pusty, czy cokolwiek innego, to '! = Null''! == undefined' i tak dalej są tak delikatne i dobre, że nie ma w tym żadnej kuloodporności. Wolisz '! = Null', aby sprawdzić' undefined' i 'null' w tym samym czasie. – Esailija

Odpowiedz

4

Gdy żaden argument nie zostanie przekazany, b jest undefined, a nie null. Tak, to właściwy sposób, aby przetestować na istnienie argumentu b to:

function a(b){ 
    console.log(b !== undefined ? 1 : 2); 
} 

!== jest zalecane, ponieważ nieważne i niezdefiniowane może być zmuszany do być równe, jeśli używasz == lub !=, ale przy użyciu !== lub === będzie nie używaj przymusu, abyś mógł dokładnie określić, czy jest to undefined czy nie.

+2

Dla kompletności, można pozbyć się 'typeof' wewnątrz funkcji, ponieważ jesteśmy w zakresie funkcji, a' undefined' nie może być nadpisany tutaj :) W zasięgu globalnym , bezpieczniej jest używać 'typeof (foo)! ==" undefined "'. –

2

Można użyć falsy charakter undefined (parametr, który nie został przekazany w rzeczywistości undefined, nie null) i po prostu napisać:

(!b)?1:2 

Jednak będzie to również prawdziwe dla 0, null i "" (wartości falsyfikacyjne).

Jeśli chcesz napisać to w kuloodporną sposób, można przejść:

typeof(b) === "undefined" 
// or thanks to the write protection for undefined in html5 
b === undefined 

Aktualizacja: dzięki ECMAScript 2015, możemy teraz użyć default parameters:

function a(b = 1){ 
    console.log(b); 
} 

Jeśli parametr jest niezdefiniowany - albo pominięty, albo wyraźnie przekazany (tutaj powinieneś użyć null) - zostanie zastosowana wartość domyślna, wszystkie pozostałe wartości pozostaną niezmienione (również te falsy). Demonstration

+0

BTW, jeśli chcesz użyć wartości domyślnych dla zmiennych, które nie zostały przekazane do funkcji, możesz napisać coś takiego jak "b = b || defaultValue'. Jest to popularny idiom JS dla 'if (! B) {b = defaultValue;}' - z takimi samymi ograniczeniami jak powyżej ('! B' jest prawdziwe, jeśli' b' ma wartość '0',' false', 'null ',' undefined' lub '" "'). –

+1

@ jakub.g To zły pomysł, ponieważ w ten sposób nie możesz przekazać '0' lub' '" 'jako parametru. Podczas pracy z wartościami domyślnymi należy sprawdzić je w bezpieczny sposób i nie używać natury falsyfikacyjnej. – Christoph

+0

Zgadza się. Bardziej sensowne jest jednak, gdy oczekiwanym parametrem powinien być obiekt ('b = b || {}'). –

Powiązane problemy