在JavaScript 里 []==[]为false?

![]为啥是false [] === [] 为false 也就算了,[]==[]也为false?

为啥[] == 0 ? 0 也等于 0 啊 难道只有一边进行转换吗?

阅读 1.8k
1 个回答

完整的 == 比较运算规则看 ES 规范:http://es5.github.io/#x11.9.3


【翻译】

比较 X == Y 时:

  1. 如果 X 与 Y 是相同类型
    a. 如果 X 的类型是 Undefined,返回 true
    b. 如果 X 的类型是 Null,返回 true
    c. 如果 X 的类型是 Number

     1. 如果 X 是 `NaN`,返回 `false`;
     2. 如果 Y 是 `NaN`,返回 `false`;
     3. 如果 X 的值与 Y 的值相同,返回 `true`;
     4. 如果 X 是 `+0` 、且 Y 是 `-0`,返回 `true`;
     5. 如果 X 是 `-0` 、且 Y 是 `+0`,返回 `true`;
     6. 否则返回 `false`。

    d. 如果 X 的类型是 String,当 X 与 Y 拥有相同的字符序列(即长度相同、逐位字符也相同)时返回 true,否则返回 false
    e. 如果 X 的类型是 Boolean,当 X 与 Y 的值同为 true 或同为 false 时返回 true,否则返回 false
    f. 如果 X 与 Y 指向相同的对象时返回 true,否则返回 false

  2. 如果 X 是 null、且 Y 是 undefined,返回 true
  3. 如果 X 是 undefined、且 Y 是 null,返回 true
  4. 如果 X 的类型是 Number、且 Y 的类型是 String,转换为 X == ToNumber(Y) 比较;
  5. 如果 X 的类型是 String、且 Y 的类型是 Number,转换为 ToNumber(X) == Y 比较;
  6. 如果 X 的类型是 Boolean,转换为 ToNumber(X) == Y 比较;
  7. 如果 Y 的类型是 Boolean,转换为 X == ToNumber(Y) 比较;
  8. 如果 X 的类型是 StringNumber、且 Y 的类型是 Object,转换为 X == ToPrimitive(Y) 比较;
  9. 如果 X 的类型是 Object、且 Y 的类型是 StringNumber,转换为 ToPrimitive(X) == Y
  10. 否则返回 false

[] == [] 对应规则 1.f[] == 0 对应规则 9

P.S. ToNumberToPrimitive 是怎么规定的我上面贴的规范里也有,就不翻译了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题