抽象等式比较算法
比较x == y,其中x和y是值,产生true或 false。如下进行这样的比较:
- 如果Type ( x ) 与Type ( y ) 相同,则
- 如果Type ( x ) 为undefined,则返回true。
- 如果Type ( x ) 为 Null,则返回true。
- 如果类型( x ) 是数字,那么
- 如果x是NaN,则返回false。
- 如果y是NaN,则返回false。
- 如果x与y是相同的 Number 值,则返回true。
- 如果x为+0且y为-0,则返回true。
- 如果x为-0且y为+0,则返回true。
- 返回假。
- 如果Type ( x ) 是字符串,则如果x和y是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true 。否则,返回 false。
- 如果Type ( x ) 是 Boolean ,如果x和y都为 true或都为false ,则返回true。否则,返回false。
- 如果x和y引用同一个对象,则返回true 。否则,返回false。
- 如果x为null且y未定义,则返回true。
- 如果x未定义且y为null ,则返回true。
- 如果Type ( x ) 是 Number 并且Type ( y ) 是 String,则
返回比较结果x == ToNumber ( y )。 - 如果Type ( x ) 是 String 并且Type ( y ) 是 Number ,则
返回比较结果ToNumber ( x ) == y。 - 如果Type ( x ) 是 Boolean ,则返回比较结果ToNumber ( x ) == y。
- 如果Type ( y ) 是 Boolean,则返回比较结果x == ToNumber ( y )。
- 如果Type ( x ) 是 String 或 Number 并且Type ( y ) 是 Object,则
返回比较结果x == ToPrimitive ( y )。 //将对象类型转化为非对象类型 - 如果Type ( x ) 是 Object 并且Type ( y ) 是 String 或 Number ,
则返回比较ToPrimitive ( x ) == y的结果。 - 返回假。
注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的评估如下:
- 令lref为评估EqualityExpression的结果。
- 令lval为GetValue ( lref )。
- 令rref为评估RelationalExpression的结果。
- 设rval为GetValue ( rref )。
返回执行严格相等比较的结果rval === lval。(见11.9.6)
11.9.5严格不等于运算符 ( !== )
产生式 EqualityExpression : EqualityExpression !== RelationalExpression的评估如下:
令lref为评估EqualityExpression的结果。
- 令lval为GetValue ( lref )。
- 令rref为评估RelationalExpression的结果。
- 设rval为GetValue ( rref )。
- 令r为执行严格相等比较rval === lval的结果。(见11.9.6)
-
11.9.6严格等式比较算法
比较x === y(其中x和y是值)产生true或 false。如下进行这样的比较:
- 如果Type ( x ) 未定义,则返回true。
- 如果Type ( x ) 为 Null,则返回true。
- 如果类型( x ) 是数字,那么
- 如果x是NaN,则返回false。
- 如果y是NaN,则返回false。
- 如果x与y是相同的 Number 值,则返回true。
- 如果x为+0且y为-0,则返回true。
- 如果x为-0且y为+0,则返回true。
- 返回假。
- 如果Type ( x ) 是 String ,则如果x和y是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true ;否则,返回 false。
- 如果Type ( x ) 是 Boolean ,如果x和y都为true或都为false ,则返回true;否则,返回false。
- 如果x和y引用同一个对象,则返回true 。否则,返回false。
笔记该算法在处理有符号零和 NaN 方面与 SameValue 算法 (9.12)不同。
The SameValue Algorithm
内部比较抽象操作 SameValue( x , y ),其中x和y是 ECMAScript 语言值,产生true或false。如下进行这样的比较:
- 如果Type ( x ) 与Type ( y ) 不同,则返回false。
- 如果Type ( x ) 未定义,则返回true。
- 如果Type ( x ) 为 Null,则返回true。
- 如果Type ( x ) 是 Number,那么。
- 如果x是 NaN 并且y是 NaN,则返回true。
- 如果x为 +0 且y为 -0,则返回false。
- 如果x为 -0 且y为 +0,则返回false。
- 如果x与y是相同的 Number 值,则返回true。
- 返回假。
- 如果Type ( x ) 是 String ,则如果x和y是完全相同的字符序列(相同长度和对应位置的相同字符),则返回true ;否则,返回 false。
- 如果Type ( x ) 是 Boolean ,如果x和y都为true或都为false ,则返回true;否则,返回false。
- 如果x和y引用同一个对象,则返回 true 。否则,返回false。