Est-ce que (a== 1 && a ==2 && a==3) est-il toujours vrai ?
Question :
L'expression (a== 1 && a ==2 && a==3) peut-elle jamais être évaluée comme vraie en JavaScript, malgré l'incohérence logique ?
Comprendre l'expression Évaluation :
Normalement, l'expression (a== 1 && a ==2 && a==3) serait toujours évaluée comme fausse car la valeur de « a » ne peut pas être simultanément 1, 2, et 3. Cependant, l'opérateur d'égalité de JavaScript (==) présente quelques bizarreries lorsqu'il s'agit de valeurs non primitives telles que des objets.
Conversion de valeur personnalisée :
JavaScript autorise les objets pour définir leurs propres fonctions toString() ou valueOf(), qui sont utilisées pour convertir l'objet en une valeur primitive à des fins de comparaison. En tirant parti de cela, il est possible de créer un objet qui change de valeur à chaque fois qu'il est converti.
Objet personnalisé avec fonction Dynamic toString() :
Considérez ce qui suit object :
<code class="js">const a = { i: 1, toString: function () { return a.i++; } }</code>
Cet objet a une propriété 'i' et une fonction toString() personnalisée. Chaque fois que l'objet est converti en une valeur primitive (par exemple, via == ou console.log()), la fonction toString() est appelée, renvoyant la valeur actuelle de « i » et l'incrémentant.
Astuce d'évaluation d'expression :
En utilisant cet objet personnalisé, l'expression (a == 1 && a == 2 && a == 3) peut maintenant être évaluée comme vraie :
<code class="js">if(a == 1 && a == 2 && a == 3) { console.log('Hello World!'); }</code>
La première comparaison (a == 1) renvoie vrai car la fonction toString() renvoie 1. La deuxième comparaison (a == 2) renvoie également vrai car la fonction toString() est à nouveau appelée, renvoyant 2. De même , la troisième comparaison (a == 3) renvoie vrai, ce qui entraîne l'évaluation de l'expression entière comme étant vraie.
Conclusion :
Bien que cela puisse sembler contre-intuitif, il est possible pour (a== 1 && a ==2 && a==3) d'évaluer true en JavaScript en créant un objet personnalisé qui modifie dynamiquement sa valeur lors de la conversion. Cela démontre le potentiel de comportement inattendu lorsqu'il s'agit de valeurs non primitives en JavaScript.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!