JavaScript的古怪弱类型==
运算符可以很容易地显示为不可传递,如下所示:
var a = "16";
var b = 16;
var c = "0x10";
alert(a == b && b == c && a != c); // alerts true
我想知道是否有任何类似的技巧可以使用舍入错误,Infinity
或NaN
可以显示===
不可传递,或者是否可以事实证明确实是过渡性的。
答案 0 :(得分:3)
Javascript中的===
运算符似乎具有传递性。
NaN
与NaN
:
>>> 0/0 === 0/0
false
>>> 0/0 !== 0/0
true
Infinity
可靠地等于Infinity
:
>>> 1/0 === 1/0
true
>>> 1/0 !== 1/0
false
对象(哈希)总是不同的:
>>> var a = {}, b = {};
>>> a === b
false
>>> a !== b
true
由于===
运算符不执行任何类型强制,因此不会发生值转换,因此原始类型的相等/不等式语义将保持一致(即不会相互矛盾),尽管解释器存在错误
答案 1 :(得分:2)
如果查看规范(http://bclary.com/2004/11/07/#a-11.9.6),您将看到没有进行类型强制。此外,其他一切都非常简单,所以也许只有实现错误才会使它不具有传递性。
答案 2 :(得分:1)
假设您有变量a,b和c,则不能100%确定here。如果有人在生产中做了如上所述的hackish,那么你可能会有更大的问题;)
var a = 1;
var b = 1;
Object.defineProperty(window,"c",{get:function(){return b++;}});
alert(a === b && b === c && a !== c); // alerts true