115 votes

Pourquoi n'1==1==1 return true, "1"=="1"=="1" renvoyer la valeur true, et "un"=="a"=="un" return false?

function a() { return (1 == 1 == 1); }
function b() { return ("1" == "1" == "1"); }
function c() { return ("a" == "a" == "a"); }

J'ai testé le code ci-dessus dans google Chrome, console et pour une raison quelconque, a() renvoie la valeur true, b() renvoie la valeur true, et c() renvoie la valeur false.

Pourquoi est-ce donc?

185voto

Jon Points 194296

Parce que vous comparez l' (boolean) résultat de la première égalité avec la (non-booléenne) troisième valeur.

Dans le code, 1 == 1 == 1 est équivalent à (1 == 1) == 1 est équivalent à true == 1.

Cela signifie que les trois méthodes peuvent être écrit plus simplement:

function a() { return (true == 1); }
function b() { return (true == "1"); }
function c() { return (true == "a"); }

Ces comparaisons travail en fonction de ces règles (l'emphase est mienne):

Si les deux opérandes ne sont pas du même type, JavaScript convertit le opérandes, puis applique une stricte comparaison. Si l'un des deux opérandes est un nombre ou une valeur de type boolean, les opérandes sont convertis en nombres si possible; d'autre si l'un des deux opérandes est une chaîne, la chaîne d'opérande est convertie en un nombre si possible. Si les deux opérandes sont des objets, puis JavaScript compare les références internes qui sont égales lorsque les opérandes se référer au même objet en mémoire.

Donc ce qui se passe dans c que "a" , est converti en un nombre (en donnant des NaN) et le résultat est strictement par rapport à l' true converti en nombre (en donnant des 1).

Depuis 1 === NaN est false, la troisième fonction renvoie false. Il est très facile de voir pourquoi les deux premières fonctions retournent true.

26voto

Von Lion Points 913

Parce qu' 1 == true

Mais "a" != true

Donc, fondamentalement, ce qui se passe, c'est que

1 == 1, "1" == "1" et "a" == "a" sont toutes évaluées true , puis de les comparer à la valeur suivante.

La chaîne "1" , est converti en un nombre (1) avant d'être comparé à d' true et est donc considérée comme égale à true.

Maintenant, le "POURQUOI?!?!" la question s'explique par le fait que Javascript a ses racines dans le C-famille de langues. Dans lequel un nombre autre que 0 est considéré comme valide true booléen. :-/

6voto

La-comadreja Points 3057

Parce que 1 et "1" sont à la fois converti au vrai, que des chiffres. Ce n'est pas le cas avec "un". Donc:

("1" == "1" == "1") 

donne

(("1" == "1") == "1") 

qui évalue à

(true == "1")

De même,

("1" == 1 == "1") 

est également vrai, ou toute combinaison de ceux-ci. En fait, tout nombre différent de zéro lors de la conversion en booléen est vrai.

Alors que, "un" ne pas avoir la valeur true.

5voto

nomen Points 819

C'est parce que le JavaScript est un langage faiblement typé. Cela signifie qu'il n'est pas assez expressif pour parler de types, et en fait implicitement contraindre les valeurs appartenant à des types à qui ils n'ont pas de relation sémantique. Donc, (1 == 1) == 1 renvoie la valeur true parce que (1 == 1) évalue à true pour que le JavaScript évalue (true) = 1. En particulier, il est en train de tourner 1 à une valeur booléenne (vrai ou à un nombre -- j'ai oublié laquelle, mais le résultat est le même).

Le point est que JavaScript est de tourner un type de valeur dans un autre type de valeur derrière votre dos.

Votre question montre pourquoi c'est un problème: ('a' == 'a') == 'a' est faux, parce que ('a' == 'a') est vrai, et JavaScript finit par comparaison (true) == 'a'. Depuis il n'y a simplement pas de meilleure façon de tourner un Booléen dans une lettre (ou une lettre dans un booléen), que l'énoncé est faux. Bien sûr, que les pauses de la transparence référentielle (==).

2voto

sdfc Points 39

C'est vrai qu' (1 == 1) == 1. Ensuite, il sera true == 1, mais pas en a == a == a.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X