Нуль - это объект типа, так что это правда? Что происходит за кулисами? - PullRequest
4 голосов
/ 03 октября 2011

Я читаю в своей книге «Элегантный JavaScript», что null == true оценивается как ложное. Используя переводчика, я подтвердил, что это TRUE. Однако позже в этой главе - фактически, на той же странице - говорится, что когда в качестве условия оператора if, while или for указывается нуль, он будет преобразован в логическое значение и вернет false.

Может кто-нибудь с более глубоким пониманием сказать мне, почему это? Я знаю, где найти исходный код браузера, но я не уверен, как нацелить программирование, ответственное за это своеобразное и неинтуитивное поведение. Поскольку я очень мало знаю C ++, я также буду признателен за любые советы по поиску такой информации, независимо от этого.

Спасибо.

Ответы [ 4 ]

6 голосов
/ 03 октября 2011

Важно отметить, что Type из null равно Null.

(игнорировать typeof возвращает "object" для null из-за плохого дизайна и обратной совместимости)

11.9.3 Алгоритм сравнения абстрактного равенства # Ⓣ Сравнение x == y, где x и y - значения, выдает true или false. Такой Сравнение выполняется следующим образом:

[... раздели]

  1. Вернуть ложь.

Спецификация ES5

Говорит, что сравнение с null и Boolean должно возвращать false, потому что Type из Null и Boolean не совпадают, и ни один из других шагов в 11.9.3 не применяется, поэтому действие по умолчанию return false происходит

Единственный случай, когда Type из x и y отличаются и либо x, либо y - это null, но операция == по-прежнему возвращает true:

Если x равен нулю, а y не определен, вернуть true.

Если x не определено, а y равно нулю, вернуть true.

Это означает, что undefined == null возвращает true

Специальное примечание:

Существует ES6: предложение гармонии для исправления typeof null

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

На самом деле я думаю, что он ссылается на тот факт, что typeof null == 'object', что, к сожалению, имеет место. Но это особенность оператора typeof, а не самого null. Null является ложным значением, но typeof возвращает для него «объект», в соответствии со спецификацией: http://bclary.com/2004/11/07/#a-11.4.3

1 голос
/ 03 октября 2011

При сравнении null с true, оно оценивается как false, , поэтому оно не равно true. Аналогично, при использовании в любом другом контексте, где он должен рассматриваться как логическое значение & mdash; как выражение if или while & mdash; это false.

Не совсем правильно говорить, что «null - это объект типа», потому что это не так. Это null. На самом деле он не имеет какого-либо типа, (Спасибо @Roee Gavirel) У него есть свой собственный тип (нулевой тип), потому что он не является ничем. Другими словами, если переменная имеет значение null, это означает, что она ни на что не ссылается; нет объектов вообще.

изменить & mdash; дерьмо держись секунду, потому что мой мозг все еще спит.

Хорошо, вот что в спецификации. Если один из операндов == является логическим, то логическое значение преобразуется в число (да, действительно), и преобразование продолжается таким образом. Вот почему null равно == ни true, ни false. Следовательно, «странность» заключается не столько в null, сколько в сложных правилах оценки == сравнений.

Раздел 11.9.3 стандарта ECMA-262 объясняет все это более или менее понятным образом. Достаточно сказать, что семантика == совсем не проста.

0 голосов
/ 03 октября 2011

Я не вижу, в чем проблема ...
if (null == true) = false затем (null == false) = true.

если вопрос «почему»,тогда ответ прост в использовании.(вероятно, взято из C), но если вы хотите узнать, является ли ссылка действительной или нет, вы можете просто сделать:

if (RefValue) {
    //bla bla bla
}

Вместо:

if (RefValue == null) {
    //bla bla bla
}
...