Путаница с автоматическим преобразованием типов в JavaScript - PullRequest
3 голосов
/ 29 октября 2011

С учетом этого сценария:

var number = NaN;

if (!number) {
  alert("yes");
}

alert(number == false);

Почему первое выражение `!number оценивается как true, а второе выражение number == false оценивается как false?

http://jsfiddle.net/8EWG4/

Ответы [ 4 ]

5 голосов
/ 29 октября 2011

Продолжайте смотреть в этой статье: http://www.smashingmagazine.com/2011/05/30/10-oddities-and-secrets-about-javascript/

В javascript есть несколько хитростей, в том числе информация о NaN:

NaN - это число

Вы думали, что ноль быть объектом - это смешно? Попробуйте разобраться с идеей NaN - «не число» - быть числом! Более того, NaN не считается равным самому себе! Ваша голова еще болит?

alert(typeof NaN); //alerts 'Number'
alert(NaN === NaN); //evaluates false

На самом деле NaN ничем не равен. Единственный способ подтвердить, что что-то - это NaN, - это функция isNaN ().

3 голосов
/ 29 октября 2011

Спецификация ECMAScript гласит:

x == y определяется как (11.9.3):

Если x равен NaN , return false .

И ! сначала вызывает ToBoolean (9.2) (а затем возвращает обратное):

Результат равен false , если аргумент равен +0, −0 или NaN ;в противном случае результат верен

2 голосов
/ 29 октября 2011

Из википедии - Синтаксис JavaScript, логическое значение :

При использовании в логическом контексте 0, -0, null, NaN, undefined и пустая строка ("") оценивать как ложное из-за автоматического приведения типов.

!NaN == true

Таким образом, когда NaN приводится к false, !NaN оценивается как true.

, NaN не равно false - это другой тип / значение.

2 голосов
/ 29 октября 2011

Чтобы оценить переменную как NaN (не число), рассмотрите возможность использования isNaN(number).Это даст вам правильный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...