2016-02-17 2 views
4

Я видел эти сниппет в polyfill, показанной на this MDN-документации:Что означает (значение неравного значения) в JavaScript?

// Casts the value of the variable to a number. 
// So far I understand it ... 
count = +count; 
// ... and here my understanding ends. 
if (count != count) { 
    count = 0; 
} 

я не получил ни малейшего представления о цели.

Как может быть что-то неравное?

ответ

5

В JavaScript NaN - единственное значение, которое не равно самому себе. Так что это проверка для NaN.

4

Это тест, когда счет NaN, потому что только NaN != NaN.

+1

Отличное объяснение, но мне это интересно. Не лучше проверить его с помощью метода 'isNaN()'? –

+0

как насчет '{}! = {}'? – Jai

+0

@ MarcosPérezGude Я думаю, что на всякий случай, что у какого-то браузера нет этой функции. – jcubic

2

Ответы Othere уже упоминали, почему требуется эта проверка. Но есть другой способ присвоить значение по умолчанию, если ожидаемое значение является значением ложности, например NaN.

Условный условие не требуется, если у вас есть это:

count = +count || 0; // so if count = NaN which is a falsy value then 0 will be assigned. 
+0

Хороший ярлык, но я думаю, что OP интересует _why_ такая проверка существует в первую очередь. –

+1

@JohnWhite на самом деле у меня было это в ответ, но поскольку это было опубликовано другими, поэтому я удалил это. – Jai

0

Попробую суммировать то, что уже было сказано

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)).

Смежные вопросы