L'opérateur == original et faiblement typé de JavaScript peut facilement être montré comme non transitif comme suit:

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

Je me demande s'il y a des tours similaires que l'on peut jouer avec une erreur d'arrondi, Infinity ou NaN qui pourraient montrer que === n'est pas transitif, ou si cela peut être prouvé être transitif.

11
Ray Toal 2 oct. 2011 à 00:11

3 réponses

Meilleure réponse

L'opérateur === en Javascript semble être aussi transitif que possible.

NaN diffère de manière fiable de NaN:

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

Infinity est de manière fiable égal à Infinity:

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

Les objets (hachages) sont toujours différents:

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

Et puisque l'opérateur === n'effectue aucune contrainte de type, aucune conversion de valeur ne peut se produire, de sorte que la sémantique d'égalité / inégalité des types primitifs restera cohérente (c'est-à-dire qu'elle ne se contredira pas), malgré les bogues d'interprétation.

3
Frédéric Hamidi 1 oct. 2011 à 21:20

Si vous regardez la spécification (http://bclary.com/2004/11/07/#a-11.9.6), vous verrez qu'aucune contrainte de type n'est effectuée. De plus, tout le reste est assez simple, donc peut-être que seuls les bogues d'implémentation le rendront non transitif.

2
deviousdodo 1 oct. 2011 à 20:19

En supposant que vous ayez la variable a, b et c, vous ne pouvez pas être certain à 100% comme indiqué ici. Si quelqu'un fait quelque chose d'aussi hackish que ci-dessus en production, alors vous avez probablement de plus gros problèmes;)

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

alert(a === b && b === c && a !== c); // alerts true
1
Lime 9 oct. 2011 à 03:18
7622671