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?
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?
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 primitiveundefined
.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:
undefined = 'A value';
tente d'affecter une chaîne de caractères'A value'
à la variable globaleundefined
- 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
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,
undefined = "A value";
est une Simple Affectation
"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."undefined"
comme le nom de la propriété, "A value"
la valeur, et la stricte drapeau comme le lancer de drapeau."undefined"
, le descripteur de propriété en {[[Value]]: "A value"}
, et de le lancer de drapeau comme arguments.Cependant, vous êtes toujours en mesure de déclarer local undefined
variables:
(function() {
var undefined = "A value";
alert(undefined); // "A value";
})();
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 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.