抽象等式比较算法

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

  1. 如果Type ( x ) 与Type ( y ) 相同,则
    1. 如果Type ( x ) 为undefined,则返回true
    2. 如果Type ( x ) 为 Null,则返回true
    3. 如果类型( x ) 是数字,那么
      1. 如果xNaN,则返回false
      2. 如果yNaN,则返回false
      3. 如果x与y是相同的 Number 值,则返回true
      4. 如果x+0y-0,则返回true
      5. 如果x-0y+0,则返回true
      6. 返回
    4. 如果Type ( x ) 是字符串,则如果xy是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true 。否则,返回 false
    5. 如果Type ( x ) 是 Boolean ,如果xy都为 true或都为false ,则返回true。否则,返回false
    6. 如果xy引用同一个对象,则返回true 。否则,返回false
  2. 如果xnully未定义,则返回true
  3. 如果x未定义ynull ,则返回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. lvalGetValue ( lref )。
  3. rref为评估RelationalExpression的结果。
  4. rvalGetValue ( rref )。
  5. 返回执行严格相等比较的结果rval === lval。(见11.9.6

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

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

  6. lref为评估EqualityExpression的结果。

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

    11.9.6严格等式比较算法

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

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

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

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

The SameValue Algorithm

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

  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 ,则如果xy是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true ;否则,返回 false
  6. 如果Type ( x ) 是 Boolean ,如果xy都为true或都为false ,则返回true;否则,返回false
  7. 如果xy引用同一个对象,则返回 true 。否则,返回false