Нужен пример, объясняющий, почему использование операндов сравнения! = И == считается плохой практикой в ​​JavaScript - PullRequest
16 голосов
/ 23 октября 2008

Поскольку я где-то читал, рекомендуется использовать! == и === вместо.

Ответы [ 7 ]

24 голосов
/ 23 октября 2008

"Используйте оператор строгого равенства (===), когда вы хотите проверить, что два операнда имеют одинаковый тип и значение. Используйте оператор регулярного равенства (==), если вы заботитесь только о значении и типе не имеет значения. Если, например, один операнд является числом 5, а другой операнд - строкой «5», стандартный оператор равенства вернет true, но, поскольку они не относятся к одному типу, оператор строгого равенства вернет ложный." http://www.webreference.com/js/column26/stricteq.html

19 голосов
/ 23 октября 2008

Это зависит от того, что вы пытаетесь сделать.

! == и === сравнивают значения и .

5 == "5"

Выше вернется true. Если это не то, что вы намеревались, вы должны сделать это вместо:

5 === "5"

Это вернет false.

4 голосов
/ 23 октября 2008

=== и! == Операторы.

Почти всегда лучше использовать === и! == операторы. Операторы == и! = Выполняют приведение типов. В в частности, не используйте == для сравнения против ложных значений.

Из Условные обозначения Дугласа Крокфорда для языка программирования JavaScript

См. Ответ Тотти для получения дополнительной информации по этому вопросу или прочитайте Дуглас Крокфорд «Элементы стиля JavaScript», часть вторая: идиомы , в которых более подробно рассматриваются концепции истинности, ложности и приведения типов JavaScript. 1015 *

3 голосов
/ 23 октября 2008

Семантика === и !== почти всегда соответствует тому, что вы имеете в виду . Когда вы сравниваете один примитив с другим, вы хотите проверить, имеют ли они одинаковое значение. Когда вы сравниваете один объект с другим, вы хотите проверить, ссылаются ли они на одно и то же.

Редактировать: Удалена дезинформация о сравнении "ложных" значений. Я просто скажу, что оператор == не может отличить null от undefined, или 0 от "", или [0] от 0. Да, я серьезно отношусь к этому последнему.

3 голосов
/ 23 октября 2008

Основная причина их исключения заключается в том, что == и != стоят дороже, чем строгие операторы === и !==. Это связано с другой серьезной проблемой: == и != оба выполняют неявное преобразование toString, если типы двух сравниваемых значений различны.

Тривиальный пример:

alert ({toString: function () {return "1"} == 1)

Это даст истину - так как toString будет вызываться для обоих значений, и результаты строки будут сравниваться. В данном конкретном случае это явно абсурдно, но это может быть проблемой и в более реальных случаях.

1 голос
/ 23 октября 2008

Что ж, я думаю, что "совет", который вы получили, вероятно, хорошо продуман, но на самом деле это не полное замечание.

JavaScript типизируется динамически, то есть переменные могут изменять тип (строка, число, логическое значение) на лету и без приведения. Парсер не будет жаловаться, если вы сделаете это

var int = 3;    // Is typeof Number
int = 'haha!';  // is typeof String

Но это не значит, что JavaScript полностью забывает о типах. Операторы равенства и неравенства (== и! =) Сравнивают вычисленные значения и игнорируют тип.

Операторы строгого равенства и строгого неравенства (=== и! ==) заботятся о типе. Таким образом, они будут сравнивать значение И тип до определения возвращаемого значения.

Подробнее здесь

http://devedge -temp.mozilla.org / библиотека / руководства / 2000 / JavaScript / 1,5 / руководство / expr.html # 1010037

0 голосов
/ 23 октября 2008

Лично, в дополнение к превосходным причинам, изложенным другими, мне просто нравится знать, что то, что я сравниваю, именно то, что я намереваюсь. Для меня важна разница между следующим, хотя они оба оценивают как !myVar:

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