Que signifie exactement indéfini en JavaScript? Pourquoi est-il là? Quels usages a-t-il? Comment cela pourrait-il être utile?

11

En JavaScript, nous avons quelque chose appelé non défini . J'ai dit quelque chose, parce que je ne sais vraiment pas si c'est une classe de base, ou une variable intégrée, ou un mot-clé, ou autre chose. Je sais juste que c'est là.

Pour le voir en action, vous pouvez simplement écrire:

undefined;
typeof undefined;

Quelqu'un peut-il m'expliquer pourquoi cette chose a été insérée dans JavaScript? Nous avons de la nullvaleur dans ce langage, donc cela ne devrait pas ressembler à quelque chose null. Dans d'autres langages, lorsque nous ne connaissons pas la valeur d'une propriété ou d'une variable, nous la mettons simplement à null. Ici, nous pouvons faire la même chose.

Comment pouvons-nous utiliser cette chose en JavaScript?

Saeed Neamati
la source

Réponses:

13

Il y a DEUX choses que vous devez comprendre sur undefined ...

  • le type undefined qui ne peut avoir qu'une seule valeur .
  • la variable undefined

Lisez maintenant attentivement ce qui suit ...

  • Il y a tellement de valeurs de type number(10, 10.01, 1e1). Mais il ne peut y avoir qu'une seule valeur de type undefined, et cette valeur est stockée dans la variable undefined. Cette valeur a une représentation littérale NO - par exemple, des valeurs numériques 1, 100, 1e-1sont tous littéraux du numéro de type, mais la valeur stockée dans la variable undefinedn'a pas de forme littérale.

  • undefinedest une variable, juste une variable normale, que JavaScript déclare et lui attribue la valeur de type undefineddans la portée globale. Vous pouvez donc faire tout ce qui suit ...

  typeof indéfini; // "indéfini"

  indéfini = 100;
  typeof indéfini; // "nombre"

  undefined = void 0;
  typeof indéfini; // "indéfini"

  window.undefined === undefined; // vrai
  window.undefined === void 0; // vrai
  
  • si vous ne souhaitez pas utiliser la variable undefined, vous pouvez générer la valeur de type undefinedpar l'expression void 0- dont le seul but est de renvoyer une valeur de type undefined.

... quelqu'un peut-il m'expliquer pourquoi cette chose a été insérée dans JavaScript ...

NON. Tout comme personne ne peut expliquer pourquoi les variables non déclarées vont à la portée globale au lieu de locales. Il vous suffit de vous entraîner à l' utiliser intelligemment au lieu d'essayer de trouver des justifications à son existence.

... nous avons une valeur nulle ...

Bien que cela nullpuisse faire des choses undefined, il est plus ou moins lié aux objectsscalaires plutôt qu'aux scalaires. En effet, JavaScript se considère nullcomme un objet - typeof nullrenvoie "objet".

À mon avis, l'essentiel est de NE PAS essayer de raisonner les buts absolus de undefinedet null- et de les utiliser dans votre code de manière intelligible, afin que votre code soit lisible, maintenable et réutilisable.

treecoder
la source
2
Bonne explication @greengit. the bottom line is to NOT try to reason the absolute purposes of undefined and null, semble que JavaScript soit un peu plus loin d'être un langage logique et nous devons simplement nous y habituer, comme expérimenter un nouveau monde.
Saeed Neamati
1
msgstr "dont le seul but est de renvoyer une valeur de type undefined". Évalue réellement voidune expression, ignore la valeur de retour et renvoie la undefinedvaleur. Quant aux différences. undefinedest utilisé par le moteur JS pour dire que cette chose n'a aucune valeur. nullest utilisé par VOUS pour dire que cette chose n'a aucune valeur. Il y a une distinction claire .
Raynos
1
undefined = 100; typeof undefined;renvoie "indéfini" pour moi, si vous essayez d'affecter à null, vous obtenez une erreur. Je voulais juste clarifier cela pour les futurs lecteurs.
Josh Rumbut
6

Désolé d'avoir répondu à une question plus ancienne, mais la raison pour laquelle vous avez besoin à la fois de non défini et de null est simple: dans un langage de typage de canard basé sur un prototype, vous devez absolument faire la différence entre "cet objet ne définit pas de valeur pour X" et "cet objet indique que X est rien / null / vide ".

Sans cette capacité, il n'y a aucun moyen de parcourir la chaîne du prototype et l'héritage ne peut donc pas fonctionner; vous devez être en mesure de déterminer que obj.someProp n'est pas défini afin que vous puissiez consulter obj.prototype.someProp et continuer la chaîne jusqu'à ce que vous trouviez une valeur. Si obj.someProp retournait null, il n'y aurait aucun moyen de savoir s'il était vraiment nul ou signifiait simplement "regardez mon prototype". La seule autre façon de contourner ce problème est d'injecter de la magie délirante dans les coulisses, ce qui brise votre capacité à jouer avec les chaînes de prototypes et à faire divers autres morceaux de magie noire JS.

Comme beaucoup de Javascript, l'idée d'undefined et de null semble au début ridicule et stupide, puis absolument brillante plus tard (puis à nouveau à wonky et stupide mais avec une explication raisonnable).

Un langage comme C # ne se compilera pas si vous accédez à une propriété qui n'existe pas et d'autres langages dynamiques lèvent souvent des exceptions lors de l'exécution lorsque vous touchez une propriété qui n'existe pas, ce qui signifie que vous devez utiliser des constructions spéciales pour les tester. Plus les classes signifient que lorsqu'un objet est instancié, vous connaissez déjà sa chaîne d'héritage et toutes ses propriétés - dans JS, je peux modifier un prototype 15 étapes plus haut dans la chaîne et ces changements apparaîtront sur les objets existants.

russbishop
la source
3

Il existe une variable globale undefined, qui est définie sur la valeur non définie. Les méchants peuvent le régler sur autre chose, il est donc préférable de ne pas lui faire confiance.

  • La valeur non définie est la valeur de retour d'une fonction qui ne renvoie pas de valeur.
  • La valeur non définie est la valeur d'une variable qui n'a pas été affectée.
  • La valeur non définie est la valeur d'un paramètre qui n'a pas été transmis.
  • La valeur non définie est la valeur d'une propriété qui n'a pas été affectée.
  • 'undefined' est le type d'une variable non déclarée. ( typeof undeclaredVariable == 'undefined'. essayer de lire la valeur d'une variable sous-définie vous obtiendra un jet ReferenceError.)

nullest subtilement cassé, car typeof null == 'object'. Je ne sais pas pourquoi nous avons undefinedet null, probablement un accident historique.

Sean McMillan
la source
2

Eh bien, undefinedune valeur sentinelle est obtenue en évaluant quelque chose qui n'est pas défini par opposition à null, qui est la valeur exactement définie pour ne rien représenter .

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

Ainsi, par exemple, la valeur de retour d'une fonction, qui ne définit pas de valeur de retour, n'est pas définie. La valeur d'une propriété non définie sur un objet n'est pas définie. La valeur de retour d'une instruction, qui n'est pas une expression, n'est pas définie (même si vous ne verrez pas cela se produire autrement que dans la console).
Veuillez noter que vous pouvez créer une fonction qui renvoie explicitement undefinedet vous pouvez définir explicitement une propriété avec la valeur de undefinedsur un objet, car au final c'est une valeur valide. Vous le feriez afin de communiquer explicitement, que quelque chose n'est pas défini .

Vous pourriez penser à la relation de undefinedet nullcomme cela entre NaNet 0.

back2dos
la source
"La valeur de retour d'une fonction, qui ne définit pas de valeur de retour, n'est pas définie", voulez-vous dire que undefinedc'est void?
Saeed Neamati
@Saeed: Pas tout à fait. voiden JavaScript est un opérateur unaire , qui prend n'importe quel argument et renvoie la valeur undefined .
back2dos