Операторы идентичности ECMAScript

Определение двух переменных как равных — это очень важное действие в дизайне программ.

ECMAScript предоставляет два набора операторов равенства: операторы равенства и неравенства используются для обработки исходных значений, а операторы строгого равенства и строгого неравенства — для обработки объектов.

Равенство и неравенство

В ECMAScript оператор равенства представлен двойным равенством (==), который возвращает true, когда и только когда два операнда равны. Неравенство представлено символом exclamación (не) и равенством (!=), который возвращает true, когда и только когда два операнда не равны. Для определения того, равны ли два операнда, оба этих оператора выполняют преобразование типов.

Правила выполнения типа преобразования такие:

  • Если один из операндов является логическим значением, перед проверкой равенства его следует преобразовать в числовое значение. false преобразуется в 0, true в 1.
  • Если один из операндов является строкой, а другой — числом, перед проверкой равенства строку следует попытаться преобразовать в число.
  • Если один из операндов является объектом, а другой — строкой, перед проверкой равенства объект следует попытаться преобразовать в строку.
  • Если один из операндов является объектом, а другой — числом, перед проверкой равенства объект следует попытаться преобразовать в число.

При сравнении этот оператор также следует следующим правилам:

  • Значения null и undefined равны.
  • При проверке равенства null и undefined не следует преобразовывать их в другие значения.
  • Если один из операндов является NaN, оператор равенства возвращает false, а оператор не равен возвращает true.
  • Если два операнда являются объектами, то сравниваются их значения по ссылке. Если два операнда指向 один и тот же объект, то оператор равенства возвращает true, в противном случае два операнда не равны.

Важно отметить:Даже если два числа оба являются NaN, оператор равенства возвращает false, потому что, согласно правилам, NaN не равен NaN.

В таблице перечислены некоторые特殊情况 и их результаты:

Выражение Значение
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true

Полный и неполный знаки равенства

Эквивалентные и неэквивалентные операторы аналогичны полным и неполным знакам равенства. Эти операторы выполняют то же действие, что и знаки равенства и неравенства, но они не выполняют преобразование типов перед проверкой эквивалентности.

Полный знак равенства представлен тремя равенствами (===), и он возвращает true только в том случае, если операнды равны без преобразования типов.

Например:

var sNum = "66";
var iNum = 66;
alert(sNum == iNum); // Вывод "true"
alert(sNum === iNum); // Вывод "false"

В этом коде первый alert использует знак равенства для сравнения строки "66" и числа 66, и выводит "true". Как уже было сказано, это потому, что строка "66" будет преобразована в число 66, и только затем сравнивается с другим числом 66. Второй alert использует полный знак равенства для сравнения строки и числа без преобразования типов, и, конечно, строка не равна числу, поэтому выводит "false".

Неэквивалентный знак представлен сочетанием感叹ика и двух равенств (!==), и он возвращает true только в том случае, если операнды не требуют преобразования типов и не равны.

Например:

var sNum = "66";
var iNum = 66;
alert(sNum != iNum); // Вывод "false"
alert(sNum !== iNum); // Вывод "true"

Здесь, первый alert использует неэквивалентный знак, чтобы преобразовать строку "66" в число 66, чтобы она была равна второй операнду 66. Поэтому результат вычисления равен "false", так как два операнда равны. Второй alert использует неэквивалентный знак. Этот оператор спрашивает: "sNum" и "iNum" различаются? Ответ на этот вопрос: да (true), так как sNum является строкой, а iNum является числом, и они, конечно, различаются.