JavaScript's quirky weakly-typed ==
operator can easily be shown to be non-transitive as follows:
var a = "16";
var b = 16;
var c = "0x10";
alert(a == b && b == c && a != c); // alerts true
I wonder if there are any similar tricks one can play with roundoff error, Infinity
, or NaN
that could should show ===
to be non-transitive, or if it can be proved to indeed be transitive.
The ===
operator in Javascript seems to be as transitive as it can get.
NaN
is reliably different from NaN
:
>>> 0/0 === 0/0
false
>>> 0/0 !== 0/0
true
Infinity
is reliably equal to Infinity
:
>>> 1/0 === 1/0
true
>>> 1/0 !== 1/0
false
Objects (hashes) are always different:
>>> var a = {}, b = {};
>>> a === b
false
>>> a !== b
true
And since the ===
operator does not perform any type coercion, no value conversion can occur, so the equality / inequality semantics of primitive types will remain consistent (i.e. won't contradict one another), interpreter bugs notwithstanding.