2015-06-21 16 views
17

Właśnie przejrzałem kod jQuery i natrafiłem na funkcję scalania. Sprawdziłem kod funkcji:Zakłopotanie, jeśli warunek w funkcji scalania jQuery

merge: function(first, second) { 
    var len = +second.length, 
     j = 0, 
     i = first.length; 

    while (j < len) { 
     first[ i++ ] = second[ j++ ]; 
    } 

    // Support: IE<9 
    // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) 

    if (len !== len) { 
     while (second[j] !== undefined) { 
      first[ i++ ] = second[ j++ ]; 
     } 
    } 

    first.length = i; 

    return first; 
}, 

Teraz jeśli pójdziesz za pomocą kodu, można natknąć się na następującym if sprawdzenia:

if (len !== len) 

to jakoś nie ma sensu do mnie do czego dokładnie służy ta kontrola i co ona robi?

len jest jasno zdefiniowany kilka linijek wyżej, tak jak poniżej:

var len = +second.length; 

Więc dlaczego ktoś sprawdzić czy len !== len? To jakoś nie ma dla mnie sensu. Czy ktoś może wyjaśnić?

+3

To nie wygląda rozsądnie, ale wygląda na "NaN! == NaN // true". Nie pytaj mnie, dlaczego ... 'isNaN (len)' wygląda dla mnie bardziej logicznie. – Jonathan

+1

@ Jonathan isNaN sprawdź, czy 'nie jest liczbą' (string, boolean ...),' len! == len' sprawdź wartość 'NaN'a – Hacketo

+0

Dzięki za wskazanie różnicy. Przyszedłem pomyśleć, że 'NaN! == NaN' jest najbardziej wtf w JS, jaki kiedykolwiek widziałem. – Jonathan

Odpowiedz

15

Jest to sprawdzian dla NaN (jak słusznie wskazano w komentarzu @ Jonathana). Z doskonałej Mozilla documentation:

NaN porównuje nierówny (poprzez ==, =, === i ==!) Do dowolnej innej wartości - w tym na inną wartość NaN. Użyj wartości Number.isNaN() lub isNaN(), aby określić najbardziej jednoznacznie, czy wartość to NaN. Lub wykonaj samodzielne porównanie: NaN, a tylko NaN, porównuje nierówne do siebie.

+0

Bez względu na to, jest to okropny sposób na napisanie bardziej czytelnego kodu. – Alp

+0

To dość powszechny ids js, ale masz rację - zabawnie szukają twórcy spoza js. Myślę, że komentarz poprzedzający linię w kodzie jQuery również łagodzi niektóre problemy z czytelnością. – Andbdrew

4

Operator + (unary plus) przypisanie var len = +second.length; dociera do przeliczenia wartości second.length na wiele wewnętrznie wywołanie valueOf() i toString(). Jeśli konwersja na numer zakończy się niepowodzeniem, przypisana zostanie NaN do zmiennej len. Jak wcześniej wspomniano, len !== len jest sposobem sprawdzenia, czy jest dostępny NaN.

+0

'przez wewnętrzne wywołanie valueOf() i toString()' Czy masz na myśli [Unary plus (+)] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators #Unary_plus)? – Jonathan

+0

Tak. Zaktualizowałem swoją odpowiedź z linkiem do dokumentacji operatora unary plus. –

+0

Ale jak to się nazywa "wywołanie valueOf() i toString()"? – Jonathan

Powiązane problemy