JavaScript运算符===可证明是否可传递?

时间:2011-10-01 20:11:39

标签: javascript equals transitivity

JavaScript的古怪弱类型==运算符可以很容易地显示为不可传递,如下所示:

var a = "16";
var b = 16;
var c = "0x10";
alert(a == b && b == c && a != c); // alerts true

我想知道是否有任何类似的技巧可以使用舍入错误,InfinityNaN可以显示===不可传递,或者是否可以事实证明确实是过渡性的。

3 个答案:

答案 0 :(得分:3)

Javascript中的===运算符似乎具有传递性。

NaNNaN

完全不同
>>> 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