我们都知道javascript在进行相等性测试时会进行时髦的转换,但是到底发生了什么呢?
> [0] == 0
true
> 0 == [[0]]
true
> [0] == [[0]]
false
是的,我对==运算符的可传递性感到天真。
[0] == 0
和0 == [[0]]
原始值与对象进行比较,从而类型转换将被执行。在这两种情况下[0]
,[[0]]
最终将被转换为原始值0
。
这是在“抽象平等比较算法”的步骤8(和9)中定义的:
- 如果Type(x)是String或Number,并且Type(y)是Object,则
返回比较结果x == ToPrimitive(y)。
但是,[0] === [[0]]
比较两个对象,两个不同的对象永远不会相等:
1楼 如果x和y指向同一对象,则返回true 。否则,返回false。
这是一个简单的示例,表明松散比较不是可传递的:
" " == 0 // true
"\n" == 0 // true
" " == "\n" // false
前两个比较执行类型转换(字符串到数字),最后一个不执行,并且两个字符串的值都不同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句