Является ли оператор JavaScript === доказуемо транзитивным? - PullRequest
11 голосов
/ 02 октября 2011

Причудливый слабо типизированный оператор JavaScript == может быть легко показан как непереходный, как показано ниже:

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

Интересно, есть ли подобные трюки, которые можно сыграть с ошибкой округления, Infinity или NaN, которые могли бы показать, что === нетранзитивен, или можно доказать, что это действительно транзитивно?

Ответы [ 3 ]

3 голосов
/ 02 октября 2011

Оператор === в Javascript, по-видимому, настолько транзитивен, насколько возможно.

NaN надежно отличается от NaN:

>>> 0/0 === 0/0
false
>>> 0/0 !== 0/0
true

Infinity isдостоверно равно Infinity:

>>> 1/0 === 1/0
true
>>> 1/0 !== 1/0
false

Объекты (хэши) всегда различны:

>>> var a = {}, b = {};
>>> a === b
false
>>> a !== b
true

И поскольку оператор === не выполняет приведение типов, преобразование значений не выполняется.может произойти, поэтому семантика равенства / неравенства примитивных типов останется непротиворечивой (то есть не будет противоречить друг другу), несмотря на ошибки интерпретатора.

2 голосов
/ 02 октября 2011

Если вы посмотрите на спецификацию (http://bclary.com/2004/11/07/#a-11.9.6)), вы увидите, что приведения типов не выполняется. Кроме того, все остальное довольно просто, поэтому, возможно, только ошибки реализации сделают его непереходным.

1 голос
/ 02 октября 2011

Если у вас есть переменные 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
...