ECMAScript | Операторы равенства (Equality Operators)

ECMAScript | Операторы равенства (Equality Operators)

 

Примечание

Результат вычисления оператора равенства всегда имеет тип Boolean, отражающий, сохраняется ли связь, указанная оператором, между двумя его операндами.

 

Синтаксис оператора равенства

EqualityExpression [In, Yield, Await] :

RelationalExpression [?In, ?Yield, ?Await]

EqualityExpression [?In, ?Yield, ?Await] == RelationalExpression [?In, ?Yield, ?Await]

EqualityExpression [?In, ?Yield, ?Await] != RelationalExpression [?In, ?Yield, ?Await]

EqualityExpression [?In, ?Yield, ?Await] === RelationalExpression [?In, ?Yield, ?Await]

EqualityExpression [?In, ?Yield, ?Await] !== RelationalExpression [?In, ?Yield, ?Await]

 

Семантика времени выполнения: оценка

EqualityExpression : EqualityExpression == RelationalExpression

1. Пусть lref будет результатом вычисления EqualityExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть rref будет результатом вычисления RelationalExpression.
4. Пусть rval будет ? GetValue(rref).
5. Верните IsLooselyEqual(rval, lval).

EqualityExpression : EqualityExpression != RelationalExpression

1. Пусть lref будет результатом вычисления EqualityExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть rref будет результатом вычисления RelationalExpression.
4. Пусть rval будет ? GetValue(rref).
5. Пусть r будет ? IsLooselyEqual(rval, lval).
6. Если r является true (истинно), вернуть false (ложь). В противном случае верните true.

EqualityExpression : EqualityExpression === RelationalExpression

1. Пусть lref будет результатом вычисления EqualityExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть rref будет результатом вычисления RelationalExpression.
4. Пусть rval будет? GetValue(rref).
5. Верните IsStrictlyEqual(rval, lval).

EqualityExpression : EqualityExpression !== RelationalExpression

1. Пусть lref будет результатом вычисления EqualityExpression.
2. Пусть lval будет ? GetValue(lref).
3. Пусть rref будет результатом вычисления RelationalExpression.
4. Пусть rval будет ? GetValue(rref).
5. Пусть r будет ! IsStrictlyEqual(rval, lval).
6. Если r является true (истинно), вернуть false (ложь). В противном случае верните true.

 

Примечание 1

Учитывая приведенное выше определение равенства:

  • Сравнение строк может быть вызвано: `$ {a}` == `$ {b}`.
  • Числовое сравнение может быть выполнено с помощью: +a == +b.
  • Логическое сравнение может быть принудительно выполнено с помощью: !a == !b.

 

Примечание 2

Операторы равенства поддерживают следующие инварианты:

  • A != B эквивалентно !(A == B).
  • A == B эквивалентно B == A, за исключением порядка оценки A и B.

 

Примечание 3

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

new String("a") == "a" и "a" == new String("a") оба являются true.

new String("a") == new String("a") является false.

 

Примечание 4

Сравнение строк использует простой тест на равенство последовательностей значений кодовых единиц. Не предпринимается попыток использовать более сложные, семантически ориентированные определения равенства символов или строк и порядка сортировки, определённые в спецификации Unicode. Следовательно, значения Strings, которые канонически равны согласно стандарту Unicode, могут быть проверены как неравные. Фактически этот алгоритм предполагает, что обе строки уже находятся в нормализованной форме.

 

Информационные ссылки

Стандарт ECMAScript — Раздел «13.11 Equality Operators» — https://tc39.es/ecma262/#sec-equality-operators