44 votes

Non défini == non défini est vrai. Mais non défini >= non défini est faux?

Je viens de poser une question plus banale.

Pourquoi undefined == undefined renvoie true, mais undefined >= undefined est false ?

undefined est égal à undefined.

Mais il n'est pas égal ou supérieur ?

11 votes

Ma supposition est que les deux balises undefined sont contraintes à NaN, qui n'est pas égal à lui-même.

1 votes

undefined === undefined || undefined > undefined et undefined >= undefined, le OU dans "supérieur ou égal à" n'est pas le même que ce OU ||

0 votes

@DeepakKamat que se passe-t-il en coulisses de >? Je pense que c'est ce à quoi cette question fait allusion

46voto

str Points 2352

Le >= opérateur est essentiellement la négation de l'< opérateur. Et les deux invoquent l'Algorithme de Comparaison Relationnelle Abstraite qui retourne indéfini pour undefined >= undefined comme défini à l'étape 3 (a à c). En fait, vous pouvez également voir que les opérateurs plus-grand-ou-égal et moins-grand-ou-égal sont uniquement censés fonctionner avec des nombres ou des chaînes de caractères.

Ensuite, dans la 6ème étape de la spécification de l'opérateur >=, vous pouvez voir pourquoi il retourne faux:

Si r est vrai ou indéfini, retournez faux. Sinon, retournez vrai.

8voto

Deepak Kamat Points 1206

undefined === undefined || undefined > undefined et undefined >= undefined, le OU dans "plus grand ou égal à" n'est pas le même que ce OU ||.

En ce qui concerne les opérateurs de comparaison tels que , <, >= etc sont destinés aux nombres et undefined n'est pas un nombre, undefined est indéfini.

Que attendriez-vous comme valeur de retour lorsque 10 >= "Hello World"? Bien sûr, un faux, mais encore une fois 10 >= "10" renvoie true car 10 == "10" est vrai et 10 === "10" est faux. Le "10" peut être converti en nombre donc nous voyons le résultat qui aurait été renvoyé dans le cas d'un nombre réel et non une chaîne avec des chiffres.

Il n'y a pas de version d'opérateur d'égalité stricte pour >= contrairement à != qui est !==

Des choses vraiment étranges et déroutantes se produisent lorsque vous essayez de comparer null, undefined, NaN - C'est quelque chose que la spécification de JavaScript pourrait répondre et comme JavaScript est un langage très typé lâche et les types sont très flexibles c'est pourquoi on peut comparer 10 et "10" et obtenir des résultats qui pourraient être obtenus uniquement en comparant deux entiers dans la plupart des autres langues.

2voto

stybl Points 7361

Les opérateurs d'inégalité (<, >, et ainsi de suite) ne peuvent pas être utilisés pour comparer des valeurs qui ne peuvent pas être implicitement converties en nombres. Cela inclut undefined. La raison derrière ce que vous voyez est que, contrairement à d'autres langages qui génèrent une erreur si vous essayez de faire quelque chose comme ça de toute façon (c'est-à-dire TypeError en python), JS vous permet de le faire. Cependant, le résultat sera toujours faux.

0 votes

Cela n'explique pas pourquoi "foo" >= "bar" est true et ne comprend pas une explication de la manière dont les opérateurs forcent leurs opérandes à un type correspondant.

1 votes

@Xufox parce que JavaScript est un langage foutrement à typage faible. Il peut convertir les chaînes de caractères contenant des nombres et les comparer, et il possède également un opérateur "===" pour effectuer une comparaison stricte au lieu de simplement convertir les chaînes en entiers et en décimaux.

8 votes

En réalité, lors de l'utilisation d'inégalités, les chaînes de caractères sont comparées lexicographiquement.

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