Как === и == по-разному обрабатывают нулевые сравнения? - PullRequest
0 голосов
/ 14 ноября 2011

У меня есть простой json-объект, который иногда определяет переменную tt, а иногда нет.

По какой-то причине jsonobject.tt == null возвращает корректно 1 или 0 в зависимости от того, определено tt. jasonobject.tt === null просто возвращает 0 независимо. Я думал, что === - это то, что нужно использовать, чтобы избежать проблем.

Что здесь происходит?

Ответы [ 3 ]

2 голосов
/ 14 ноября 2011

=== - оператор строгого равенства, он сравнивает как тип, так и значение.Значение null является нулевым типом, который имеет ровно одно значение - null.

Undefined - это неопределенный тип, который также имеет только одно значение - 'undefined'.

При использованииоператор строгого равенства, null! == undefined, поскольку они являются разными типами (см. шаг 1 Алгоритма сравнения строгого равенства, ECMA-262, § 11.9.6).

== - оператор равенства.Сравнения с использованием == используют алгоритм сравнения абстрактного равенства (ECMA-262 § 11.9.3), который включает в себя:

  1. Если тип (x) совпадает с типом (y),затем ...
  2. Если x равно нулю, а y не определено, верните true.
  3. Если x не определено и y равно нулю, верните true.

Так null == undefined возвращает истину по определению.Строго говоря, для проверки наличия свойства (независимо от его значения) следует использовать hasOwnProperty :

if (jsonobject.hasOwnProperty('tt')) {
  // property exists
}

, однако на практике не существует большой разницы для строгого теста для undefined :

if (jsonobject.tt === undefined) 

, поскольку свойство существует и имеет значение undefined или не определено вообще, обычно эквивалентно.Использование === также означает, что приведенное выше вернет false, если tt существует, но ему присвоено значение null.

0 голосов
/ 14 ноября 2011

Если переменная не была определена, она имеет значение undefined.

undefined == null

тогда

undefined !== null
0 голосов
/ 14 ноября 2011

По какой-то причине (jsonobject.tt == null) возвращает правильно 1 или 0

Во-первых, сравнение возвращает true или false

Во-вторых, вы хотите

jsonobject.tt === undefined

Если значение не существует, оно не определено.

Другие методы обнаружения:

!jsonobject.hasOwnProperty("tt");

или

!("tt" in jsonobject)

В качестве побочного эффекта от ==, являющегося совершенно странным оператором, null == undefined. Таким образом, jsonobject.tt == null вернет true, если свойство отсутствует

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