Попробую суммировать то, что уже было сказано
if (count != count) {
count
проверяет, является NaN
. Согласно specs:
Надежный способ для ECMAScript кода, чтобы проверить, если значение X является NaN является выражением вида Х == X. Результат будет справедливо, если и только если X является! NaN.
(Это не имеет большого значения, в этом случае, но polyfill использует !=
вместо !==
в соответствии с требованиями стандарта).
Возможно, вы захотите спросить, почему бы не использовать isNaN
? Так как isNaN
не выполняет то, что подразумевает его название, он не проверяет, является ли значение NaN
, оно проверяет, будет ли значение NaN
при преобразовании в Номер. Например, "foo"
явно не NaN
, но isNaN("foo")
будет True
. И наоборот, isNaN([[1]])
- False
, хотя [[1]]
- неправильный номер.
Как насчет count = +count || 0
? Это допустимый ярлык, но полинумы MDN стараются следовать стандарту как можно ближе. spec for String.repeat
говорит:
Позвольте n быть ToInteger (count).
где ToInteger
является
Пусть номер будет ToNumber (аргумент).
...
Если число NaN, вернуть +0.
Обратите внимание, что он не говорит «называют IsNaN», он говорит: «если номер является NaN», и способ узнать это сравнить number
с собой.
Другой вариант: Number.isNaN
, который, в отличие от глобального isNaN
, не принуждает его аргумент. Number.isNaN(x)
возвращает истину, если и только если х фактически NaN
Number.isNaN("foo") => false
Number.isNaN([[11]]) => false
Number.isNaN(0/0) => true
Так загадочно оператор сравнения if (count !== count)
может быть заменен if (Number.isNaN(count))
.
Отличное объяснение, но мне это интересно. Не лучше проверить его с помощью метода 'isNaN()'? –
как насчет '{}! = {}'? – Jai
@ MarcosPérezGude Я думаю, что на всякий случай, что у какого-то браузера нет этой функции. – jcubic