2013-07-16 8 views
8

Z książki utrzymaniu JavaScript go wymienić:Dlaczego to nie jest dobry, aby używać do testowania, jeśli argumentem jest przekazywana

// Bad: Testing to see if an argument was passed 
function doSomething(arg1, arg2, arg3, arg4){ 
if (arg4 != null){ 
    doSomethingElse(); 
    } 
} 

ale czuję używając != null tutaj jest dość skuteczny, to filtruje zarówno argument nie został przekazany lub jest przekazywany jako nieważny

jakikolwiek powód, dla którego autor sugeruje, że jest on zły?

+4

Skąd mamy wiedzieć, co autor myśli? Zapytaj autora! –

+0

Zakładam, że ta rada jest oferowana, ponieważ jest użyteczne rozróżnianie między 'null' i bez argumentów. 'undefined' zwykle oznacza" nie ma jeszcze wartości ", podczas gdy' null' zwykle oznacza "celowo podana wartość nic". – apsillers

+0

Wyjaśnienie znajduje się na stronie przed tą, która zawiera wysłany kod. – j08691

Odpowiedz

8

!= null jest fałszywe dla undefined, w zasadzie oznacza x !== null && x !== undefined. != ma typ przymusu, a jednym z efektów jest to, że traktuje on jako równoważne null i undefined (null == undefined jest prawdziwe).

Więc jeśli tego nie chcesz, niektórzy ludzie nie zalecają używania != z null (lub undefined).

I masz rację, że kod chroni przed dwoma (no właściwie trzy) możliwości:

  1. Nic nie został przekazany do argumentu wcale.

  2. null został przekazany.

  3. undefined został przekazany.

Ale komentarz mówi, że to zły sposób na sprawdzenie, czy argument został przekazany, a to: Bo to nie złapać przechodzącej null lub undefined. (Przechodząc w null i nie przechodząc w wszystko, co, to są różne przypadki.) To nie musi oznaczać, że jest to zły sposób sprawdzenia argumentu dla określonej funkcji.

-1

Ponieważ można przekazać cokolwiek do funkcji, także null. Jeśli chcesz się do następujących:

var obj = new MyObject(); 
// ... 
obj = null; 
// ... 
doSomething(arg1, arg2, arg3, obj); 

Można by minęło argument ale twój sprawdzanie nie powiedzie się, ponieważ minęło odniesienia jest zerowy. Zawsze używaj:

if(typeof arg4 != 'undefined') 
    // ... 
+0

Dlaczego sprawdzanie się nie powiedzie? Wydaje się oczywiste, że kod ma również chronić przed 'null'. –

+0

Aby być sprawiedliwym, 'obj = undefined' * powinno * być identyczne z pominięciem argumentu. Powinieneś zająć się różnicą między 'null' i' undefined'. – apsillers

+0

@CrazyTrain Autor oryginalnego przykładu kodu próbował wyjaśnić, że * chyba że chcesz chronić się przed 'null' *, nie sprawdzaj przed'! = Null'. Sprawdzanie przeciwko 'null' jest oferowane (w tym przypadku) jako * defekt * kodu, gdzie faktycznym zamiarem jest tylko przetestowanie liczby zdefiniowanych argumentów. – apsillers

0

Pewnie. W javascript możesz mieć wartości null i wartości undefined. I nie są one takie same. Szybkie i proste podejście do sprawdzenia czy arg jest ważna będzie prawdopodobnie:

if (arg4)

iw ten sposób sprawdzić Arg4 nie jest zerowa, nie zdefiniowana, a nie fałszywy. Bądź ostrożny z tym ostatnim warunkiem, możesz świadomie poinformować o fałszywej wartości :-)

EDYCJA: T.J. Crowder jest tutaj. Jest łatwy w użyciu i będzie działał w większości przypadków, ale bądź ostrożny.

+0

Najlepsza odpowiedź, chyba że arg4 jest wartością logiczną :) – EkoostikMartin

+6

* "Najlepszym sposobem sprawdzenia, czy argument jest poprawny, prawdopodobnie byłby" * Nie, to również usunie "", '', '0',' NaN' oraz 'false' (oprócz' null' i 'undefined'). Jest wiele razy, kiedy cię to ugryzie. Jest to świetny sprawdzian dla opcjonalnych argumentów * obiektu *, ale poza tymi, staje się ryzykowny. (Nie mój dv) –

Powiązane problemy