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.
3 réponses
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.
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.
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
Questions connexes
De nouvelles questions
javascript
Pour des questions concernant la programmation dans ECMAScript (JavaScript / JS) et ses divers dialectes / implémentations (hors ActionScript). Veuillez inclure toutes les balises pertinentes dans votre question; par exemple, [node.js], [jquery], [json], etc.