Результат вычисления оператора равенства всегда имеет тип 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.
Учитывая приведенное выше определение равенства:
- Сравнение строк может быть вызвано:
`$ {a}` == `$ {b}`
. - Числовое сравнение может быть выполнено с помощью:
+a == +b
. - Логическое сравнение может быть принудительно выполнено с помощью:
!a == !b
.
Операторы равенства поддерживают следующие инварианты:
A != B
эквивалентно!(A == B)
.A == B
эквивалентноB == A
, за исключением порядка оценкиA
иB
.
Оператор равенства не всегда транзитивен. Например, может быть два разных объекта String, каждый из которых представляет одно и то же значение String; каждый объект String будет считаться равным значению String оператором ==
, но два объекта String не будут равны друг другу. Например:
new String("a") == "a"
и "a" == new String("a")
оба являются true
.
new String("a") == new String("a")
является false
.
Сравнение строк использует простой тест на равенство последовательностей значений кодовых единиц. Не предпринимается попыток использовать более сложные, семантически ориентированные определения равенства символов или строк и порядка сортировки, определённые в спецификации Unicode. Следовательно, значения Strings, которые канонически равны согласно стандарту Unicode, могут быть проверены как неравные. Фактически этот алгоритм предполагает, что обе строки уже находятся в нормализованной форме.
Информационные ссылки
Стандарт ECMAScript — Раздел «13.11 Equality Operators» — https://tc39.es/ecma262/#sec-equality-operators