我们都知道
javascript在测试平等时会做出时髦的转换,但究竟在幕后发生了什么?
> [0] == 0 true > 0 == [[0]] true > [0] == [[0]] false
是的,期待来自==运算符的传递性,我很天真.
解决方法
[0] == 0和0 == [[0]]将原始值与对象进行比较,从而执行类型转换.在这两种情况下,[0]和[[0]]最终将转换为原始值0.
这在The Abstract Equality Comparison Algorithm的步骤8(和9)中定义:
- If Type(x) is either String or Number and Type(y) is Object,
return the result of the comparison x == ToPrimitive(y).
但是,[0] === [[0]]比较两个对象,两个不同的对象永远不会彼此相等:
1f. Return true if x and y refer to the same object. Otherwise,return false.
这是一个稍微简单的例子,它表明松散的比较是不可传递的:
" " == 0 // true "\n" == 0 // true " " == "\n" // false
前两个比较执行类型转换(字符串到数字),最后一个不执行,两个字符串的值都不同.