Недоумение, если условие в функции слияния jQuery
Я просто просматривал код 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;
},
Теперь, если вы пройдете через код, вы столкнетесь с следующей проверкой if
:
if ( len !== len )
Это как-то не имеет для меня смысла, что именно эта проверка и что она делает?
len
четко определен несколько строк выше, например:
var len = +second.length;
Так почему бы кто-нибудь проверить, если len !== len
? Это мне почему-то не имеет смысла. Может кто-нибудь объяснить?
Ответы
Ответ 1
Это проверка на NaN
(как правильно указано в комментарии @Jonathan). Из отличной документации Mozilla:
NaN
сравнивает неравные (через ==,! =, ===, и! ==) с любым другим значением - в том числе и с другим значением NaN
. Используйте Number.isNaN()
или isNaN()
, чтобы наиболее четко определить, имеет ли значение NaN
. Или выполните самосогласование: NaN
и только NaN
, будут сравнивать неравные с самим собой.
Ответ 2
Оператор +
(унарный плюс) в присваивании var len = +second.length;
пытается преобразовать значение second.length
в число внутренне вызывая valueOf()
и toString()
. Если преобразование в число терпит неудачу, оно назначит NaN
переменной len
. Как было сказано ранее, len !== len
- это способ проверить NaN
.