ECMAScript® 2024 Language Specification

Draft ECMA-262 / February 15, 2024

13.11 Equality Operators

Note

The result of evaluating an equality operator is always of type Boolean, reflecting whether the relationship named by the operator holds between its two operands.

Syntax

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]

13.11.1 Runtime Semantics: Evaluation

EqualityExpression : EqualityExpression == RelationalExpression
  1. Let lref be ? Evaluation of EqualityExpression.
  2. Let lval be ? GetValue(lref).
  3. Let rref be ? Evaluation of RelationalExpression.
  4. Let rval be ? GetValue(rref).
  5. Return ? IsLooselyEqual(rval, lval).
EqualityExpression : EqualityExpression != RelationalExpression
  1. Let lref be ? Evaluation of EqualityExpression.
  2. Let lval be ? GetValue(lref).
  3. Let rref be ? Evaluation of RelationalExpression.
  4. Let rval be ? GetValue(rref).
  5. Let r be ? IsLooselyEqual(rval, lval).
  6. If r is true, return false. Otherwise, return true.
EqualityExpression : EqualityExpression === RelationalExpression
  1. Let lref be ? Evaluation of EqualityExpression.
  2. Let lval be ? GetValue(lref).
  3. Let rref be ? Evaluation of RelationalExpression.
  4. Let rval be ? GetValue(rref).
  5. Return IsStrictlyEqual(rval, lval).
EqualityExpression : EqualityExpression !== RelationalExpression
  1. Let lref be ? Evaluation of EqualityExpression.
  2. Let lval be ? GetValue(lref).
  3. Let rref be ? Evaluation of RelationalExpression.
  4. Let rval be ? GetValue(rref).
  5. Let r be IsStrictlyEqual(rval, lval).
  6. If r is true, return false. Otherwise, return true.
Note 1

Given the above definition of equality:

  • String comparison can be forced by: `${a}` == `${b}`.
  • Numeric comparison can be forced by: +a == +b.
  • Boolean comparison can be forced by: !a == !b.
Note 2

The equality operators maintain the following invariants:

  • A != B is equivalent to !(A == B).
  • A == B is equivalent to B == A, except in the order of evaluation of A and B.
Note 3

The equality operator is not always transitive. For example, there might be two distinct String objects, each representing the same String value; each String object would be considered equal to the String value by the == operator, but the two String objects would not be equal to each other. For example:

  • new String("a") == "a" and "a" == new String("a") are both true.
  • new String("a") == new String("a") is false.
Note 4

Comparison of Strings uses a simple equality test on sequences of code unit values. There is no attempt to use the more complex, semantically oriented definitions of character or string equality and collating order defined in the Unicode specification. Therefore Strings values that are canonically equal according to the Unicode Standard could test as unequal. In effect this algorithm assumes that both Strings are already in normalized form.