16

今天在 JS笔试题@公子 给AT了,遂想起之前要写的一篇文章,javascript 中蛋疼的比较运算。

翻译自:http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

11.9.3 抽象相等比较算法

比较运算 x==y, 其中 xy 是值,产生 true 或者 false。这样的比较按如下方式进行:

  1. Type(x)Type(y) 相同, 则

    1. Type(x)Undefined, 返回 true

    2. Type(x)Null, 返回 true

    3. Type(x)Number, 则

      1. xNaN, 返回 false

      2. yNaN, 返回 false

      3. xy 为相等数值, 返回 true

      4. x+0y−0, 返回 true

      5. x−0y+0, 返回 true

      6. 返回 false

    4. Type(x)String, 则当 xy 为完全相同的字符序列(长度相等且相同字符在相同位置)时返回 true。 否则, 返回 false

    5. Type(x)Boolean, 当 xy 为同为 true 或者同为 false 时返回 true。 否则, 返回 false

    6. xy 为引用同一对象时返回 true。否则,返回 false

  2. xnullyundefined, 返回 true

  3. xundefinedynull, 返回 true

  4. Type(x)NumberType(y)String, 返回 comparison x == ToNumber(y) 的结果。

  5. Type(x)StringType(y)Number

  6. 返回比较 ToNumber(x) == y 的结果。

  7. Type(x)Boolean, 返回比较 ToNumber(x) == y 的结果。

  8. Type(y)Boolean, 返回比较 x == ToNumber(y) 的结果。

  9. Type(x)StringNumber,且 Type(y)Object,返回比较 x == ToPrimitive(y) 的结果。

  10. Type(x)ObjectType(y)StringNumber, 返回比较 ToPrimitive(x) == y 的结果。

  11. 返回 false

注:按以上相等之定义:

  • 字符串比较可以按这种方式强制执行: "" + a == "" + b

  • 数值比较可以按这种方式强制执行: +a == +b

  • 布尔值比较可以按这种方式强制执行: !a == !b

注:等值比较操作保证以下不变:

  • A != B 等价于 !(A==B)

  • A == B 等价于 B == A,除了 A 与 B 的执行顺序。

注:相等运算符不总是传递的。 例如,两个不同的 String 对象,都表示相同的字符串值;== 运算符认为每个 String 对象都与字符串值相等,但是两个字符串对象互不相等。例如:

  • new String("a") == "a""a" == new String("a") 皆为 true

  • new String("a") == new String("a")false

字符串比较使用的方式是简单地检测字符编码单元序列是否相同。不会做更复杂的、基于语义的字符或者字符串相等的定义以及 Unicode 规范中定义的 collating order。所以 Unicode 标准中认为相等的 String 值可能被检测为不等。实际上这一算法认为两个字符串已经是经过规范化的形式。

11.9.6 严格等于比较算法

比较 x===yxy 为值,需要产出 truefalse。比较过程如下:

  1. 如果 Type(x)Type(y) 的结果不一致,返回 false,否则

  2. 如果 Type(x) 结果为 Undefined,返回 true

  3. 如果 Type(x) 结果为 Null,返回 true

  4. 如果 Type(x) 结果为 Number,则

    1. 如果 xNaN,返回 false

    2. 如果 yNaN,返回 false

    3. 如果 xy 为同一个数字,返回 true

    4. 如果 x+0y-0,返回 true

    5. 如果 x-0y+0,返回 true

    6. 返回 false

  5. 如果 Type(x) 结果为 String,如果 xy 为完全相同的字符序列(相同的长度和相同的字符对应相同的位置),返回 true,否则,返回 false

  6. 如果 Type(x) 结果为 Boolean,如果 xy 都为 truefalse,则返回 true,否则,返回 false

  7. 如果 xy 引用到同一个 Object 对象,返回 true,否则,返回 false

注:此算法与 SameValue 算法在对待有符号的零和 NaN 上表现不同。

justjavac微信公众号


justjavac
47.8k 声望15.9k 粉丝

会写点 js 代码