javascriptequalstransitivity

Is the JavaScript operator === provably transitive?


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.


Solution

  • 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.