详解一下 javascript 中的比较

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

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

11.9.3 抽象相等比较算法

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

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

    1. Type(x)Undefined, 返回 true微信

    2. Type(x)Null, 返回 true编码

    3. Type(x)Number, 则spa

      1. xNaN, 返回 false翻译

      2. yNaN, 返回 falsecode

      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微信公众号

相关文章
相关标签/搜索