59 votes

Ce qui se passe si nous avons défini la valeur undefined?

Ce que fait cette ligne ci-dessous?

undefined = 'A value';

Si elle ne change pas la valeur de undefined puis ce qui se passe derrière les coulisses?

53voto

Oleg Points 2511

undefined est une propriété de l'objet global, c'est à dire qu'il est une variable de portée globale. La valeur initiale de l' undefined est la valeur primitive undefined.

Voir https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined

Donc, c'est juste une variable, rien de spécial à ce sujet. Maintenant, pour répondre à vos questions:

  1. undefined = 'A value'; tente d'affecter une chaîne de caractères 'A value' à la variable globale undefined
  2. Dans les anciens navigateurs les changements de valeur, c'est à dire undefined === 'A value'; // true. Dans les navigateurs les plus récents en vertu de la mode strict, le fonctionnement et les résultats dans une erreur.

Vous pouvez tester la suivante dans un navigateur de la console (je suis en utilisant un navigateur moderne ici - Google Chrome):

undefined = true;
console.log(undefined); // undefined
// in older browsers like the older Internet Explorer it would have logged true

La valeur de undefined ne change pas dans l'exemple ci-dessus. C'est parce que (l'emphase est mienne):

Dans les navigateurs modernes (JavaScript 1.8.5 / Firefox 4+), indéfini est un non-configurable, non accessible en écriture de la propriété par la spécification ECMAScript 5.

En vertu de la mode strict:

'use strict';
undefined = true; // VM358:2 Uncaught TypeError: Cannot assign to read only property 'undefined' of object

28voto

Oriol Points 20803

Contrairement à des choses comme l' true, 123 ou null, undefined n'est pas un littéral. Cela signifie que l'aide de l' undefined identifiant n'est pas un moyen infaillible pour obtenir la valeur undefined. Au lieu de cela, ils peuvent utiliser de l' void de l'opérateur, par exemple, void 0.

Par défaut, undefined défini une propriété de l' objet global, qui est une variable globale. Avant d'ECMAScript 5, que la propriété est accessible en écriture, donc

undefined = "A value";

remplacer la valeur de window.undefined, en supposant qu'il n'était pas masqué par une variable locale. Alors si vous avez utilisé "A value" === undefined, true. Et void 0 === undefined produirait false.

ECMAScript 5 modifié ce comportement, et maintenant la propriété n'est pas accessible en écriture, ni configurable. Par conséquent, les affectations à l' undefined sera ignoré dans la non-mode strict, et lève une exception est en mode strict. Sous le capot,

  1. undefined = "A value"; est une Simple Affectation
  2. Qui utilise PutValue mettre la valeur "A value" dans une référence à la base de l'objet global, nom référencé "undefined", et à la stricte drapeau si la cession est faite en mode strict.
  3. Il appelle la [[]] méthode interne de l'objet global, en passant "undefined" comme le nom de la propriété, "A value" la valeur, et la stricte drapeau comme le lancer de drapeau.
  4. Il appelle la [[DefineOwnProperty]] méthode interne de l'objet global, en passant "undefined", le descripteur de propriété en {[[Value]]: "A value"}, et de le lancer de drapeau comme arguments.
  5. Il rejette, c'est, déclenche une exception TypeError si le lancer de drapeau est vrai, sinon retourne false.

Cependant, vous êtes toujours en mesure de déclarer local undefined variables:

(function() {
  var undefined = "A value";
  alert(undefined); // "A value";
})();

3voto

FredMaggiowski Points 1726

J'ai fait un petit POC avec et sans strict mode.

L'effet est que, si vous n'êtes pas à l'aide de strict mode tout va bien. Si vous utilisez strict mode vous aurez une belle:

TypeError: Ne peut pas attribuer à la propriété en lecture seule 'undefined'

Maintenant, passons à la POC:

"use strict"
var c;

if (c === undefined) {
  console.log("nothing happened")
}

undefined = "goofy"

c = "goofy"

if (c === undefined) {
  console.log("c is 'goofy' and it's equal to undefined.. gosh.. we broke js")
}

Maintenant, comme je l'ai dit, avec le mode strict que vous obtenir un TypeError lors du retrait de l' "use strict" le script va bien et le résultat est tout simplement nothing happened.

J'ai trouvé cette Q/r qui pourrait être utile si vous souhaitez en savoir plus

NOTE: j'ai testé ce code à l'aide d' Node.js.

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