11

JavaScriptの風変わりな弱い型の==演算子は、次のように非推移的であることが簡単に示されます。

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

丸め誤差で遊ぶことができる同様のトリックがあるかどうかInfinity、またはそれが非推移的でNaNあることが示される可能性があるか、またはそれが実際に推移的であることが証明できるかどうか疑問に思います。===

4

3 に答える 3

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

また、===演算子は型の強制を実行しないため、値の変換は発生しないため、プリミティブ型の等値/不等値のセマンティクスは一貫したままになります (つまり、相互に矛盾することはありません)。インタプリタのバグにもかかわらず。

于 2011-10-01T20:24:00.160 に答える
2

仕様 (http://bclary.com/2004/11/07/#a-11.9.6) を見ると、型強制が行われていないことがわかります。また、他のすべては非常に簡単なので、おそらく実装のバグだけが非推移的になります。

于 2011-10-01T20:19:10.993 に答える
1

変数 a、b、および c があると仮定すると、ここに示すように 100% 確実ではありません。誰かが本番環境で上記のようなハックなことをしている場合、おそらくもっと大きな問題があります;)

var a = 1;
var b = 1;
Object.defineProperty(window,"c",{get:function(){return b++;}});

alert(a === b && b === c && a !== c); // alerts true
于 2011-10-01T20:56:05.093 に答える