抽象等式比较算法

比较x == y,其中x和y是值,产生true或 false。如下进行这样的比较:

  1. 如果Type ( x ) 与Type ( y ) 相同,则
    1. 如果Type ( x ) 为undefined,则返回true。
    2. 如果Type ( x ) 为 Null,则返回true。
    3. 如果类型( x ) 是数字,那么
      1. 如果x是NaN,则返回false。
      2. 如果y是NaN,则返回false。
      3. 如果x与y是相同的 Number 值,则返回true。
      4. 如果x为+0且y为-0,则返回true。
      5. 如果x为-0且y为+0,则返回true。
      6. 返回假。
    4. 如果Type ( x ) 是字符串,则如果x和y是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true 。否则,返回 false。
    5. 如果Type ( x ) 是 Boolean ,如果x和y都为 true或都为false ,则返回true。否则,返回false。
    6. 如果x和y引用同一个对象,则返回true 。否则,返回false。
  2. 如果x为null且y未定义,则返回true。
  3. 如果x未定义且y为null ,则返回true。
  4. 如果Type ( x ) 是 Number 并且Type ( y ) 是 String,则
    返回比较结果x == ToNumber ( y )。
  5. 如果Type ( x ) 是 String 并且Type ( y ) 是 Number ,则
    返回比较结果ToNumber ( x ) == y。
  6. 如果Type ( x ) 是 Boolean ,则返回比较结果ToNumber ( x ) == y。
  7. 如果Type ( y ) 是 Boolean,则返回比较结果x == ToNumber ( y )。
  8. 如果Type ( x ) 是 String 或 Number 并且Type ( y ) 是 Object,则
    返回比较结果x == ToPrimitive ( y )。 //将对象类型转化为非对象类型
  9. 如果Type ( x ) 是 Object 并且Type ( y ) 是 String 或 Number ,
    则返回比较ToPrimitive ( x ) == y的结果。
  10. 返回假。

注1鉴于上述平等的定义:

  • 可以通过以下方式强制进行字符串比较:“” + a == “” + b。
  • 可以通过以下方式强制进行数字比较:+a == +b。
  • 可以通过以下方式强制进行布尔比较:!a == !b.

笔记2等式运算符保持以下不变量:

  • A != B相当于!(A == B)。
  • A == B等价于,除了和B == A的求值顺序。AB

注3等式运算符并不总是可传递的。例如,可能有两个不同的 String 对象,每个对象代表相同的 String 值;操作员会认为每个 String 对象都等于 String 值==,但两个 String 对象不会彼此相等。例如:

  • new String(“a”) == “a”并且“a” == new String(“a”)都是真实的。
  • new String(“a”) == new String(“a”)是假的。

注 4字符串比较对代码单元值序列使用简单的相等性测试。没有尝试使用 Unicode 规范中定义的更复杂的、面向语义的字符或字符串相等和整理顺序定义。因此,根据 Unicode 标准规范相等的字符串值可以测试为不相等。实际上,这个算法假设两个字符串都已经是规范化的形式。

11.9.4严格等于运算符 ( === )

产生式 EqualityExpression : EqualityExpression === RelationalExpression的评估如下:

  1. 令lref为评估EqualityExpression的结果。
  2. 令lval为GetValue ( lref )。
  3. 令rref为评估RelationalExpression的结果。
  4. 设rval为GetValue ( rref )。
  5. 返回执行严格相等比较的结果rval === lval。(见11.9.6)

    11.9.5严格不等于运算符 ( !== )

    产生式 EqualityExpression : EqualityExpression !== RelationalExpression的评估如下:

  6. 令lref为评估EqualityExpression的结果。

  7. 令lval为GetValue ( lref )。
  8. 令rref为评估RelationalExpression的结果。
  9. 设rval为GetValue ( rref )。
  10. 令r为执行严格相等比较rval === lval的结果。(见11.9.6)
  11. 如果r为true,则返回false。否则,返回true。

    11.9.6严格等式比较算法

    比较x === y(其中x和y是值)产生true或 false。如下进行这样的比较:

  12. 如果Type ( x ) 与Type ( y ) 不同,则返回 false。

  13. 如果Type ( x ) 未定义,则返回true。
  14. 如果Type ( x ) 为 Null,则返回true。
  15. 如果类型( x ) 是数字,那么
    1. 如果x是NaN,则返回false。
    2. 如果y是NaN,则返回false。
    3. 如果x与y是相同的 Number 值,则返回true。
    4. 如果x为+0且y为-0,则返回true。
    5. 如果x为-0且y为+0,则返回true。
    6. 返回假。
  16. 如果Type ( x ) 是 String ,则如果x和y是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true ;否则,返回 false。
  17. 如果Type ( x ) 是 Boolean ,如果x和y都为true或都为false ,则返回true;否则,返回false。
  18. 如果x和y引用同一个对象,则返回true 。否则,返回false。

笔记该算法在处理有符号零和 NaN 方面与 SameValue 算法 (9.12)不同。

The SameValue Algorithm

内部比较抽象操作 SameValue( x , y ),其中x和y是 ECMAScript 语言值,产生true或false。如下进行这样的比较:

  1. 如果Type ( x ) 与Type ( y ) 不同,则返回false。
  2. 如果Type ( x ) 未定义,则返回true。
  3. 如果Type ( x ) 为 Null,则返回true。
  4. 如果Type ( x ) 是 Number,那么。
    1. 如果x是 NaN 并且y是 NaN,则返回true。
    2. 如果x为 +0 且y为 -0,则返回false。
    3. 如果x为 -0 且y为 +0,则返回false。
    4. 如果x与y是相同的 Number 值,则返回true。
    5. 返回假。
  5. 如果Type ( x ) 是 String ,则如果x和y是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true ;否则,返回 false。
  6. 如果Type ( x ) 是 Boolean ,如果x和y都为true或都为false ,则返回true;否则,返回false。
  7. 如果x和y引用同一个对象,则返回 true 。否则,返回false。