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 ?
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 ?
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.
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.
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.
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.
@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.
En réalité, lors de l'utilisation d'inégalités, les chaînes de caractères sont comparées lexicographiquement.
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.
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
etundefined >= 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 allusion0 votes
non défini
n'est pas un nombre et c'est ce qui se passe.10 >= "hello world"
renvoie faux est simple à comprendre. Donc, je suppose qu'utiliser un opérateur de comparaison sur Not a Number renverrait toujours faux.2 votes
Oui, je suis d'accord avec Xufox. JavaScript essaie probablement de les convertir en valeurs comparables, par exemple un nombre. Mais undefined converti en nombre est NaN, qui n'est ni égal à lui-même ni plus grand que lui-même.
0 votes
J'ai la même pensée que @Xufox. Parce que nous savons tous que l'opérateur d'égalité va essayer de convertir le type avant de réellement comparer la valeur. Vous pouvez consulter le lien ici pour voir comment le type sera converti lors de la comparaison d'égalité. developer.mozilla.org/en-US/docs/Web/JavaScript/… Mais pour >= je n'ai aucune idée cependant.
1 votes
@trungk18 en gros, il essaie d'abord d'obtenir soit une chaîne de caractères, soit un nombre s'ils sont des objets et à partir de là, il les convertira en nombres si les deux ne sont pas des chaînes de caractères.
8 votes
wat
38 votes
C'est du Javascript. N'essayez pas d'utiliser la logique.
0 votes
Intervention obligatoire sur les éclairs wat
0 votes
Essayez
x = {valueOf(){ return NaN }}; console.log(x == x, x >= x)
. L'opérateur==
ne réalise pas toujours de comparaison relationnelle.