Quelle est la principale différence entre les variables déclarées par JavaScript et les variables non déclarées, puisque L'opérateur de suppression ne fonctionne pas avec les variables déclarées?
var y = 43; // declares a new variable
x = 42;
delete x; // returns true (x is a property of the global object and can be deleted)
delete y; // returns false (delete doesn't affect variable names)
Pourquoi cela arrive-t-il? Les variables déclarées globalement sont également les propriétés de l'objet window, alors pourquoi ne peut-il pas être supprimé?
Le mécanisme pour les stocker et y accéder est le même, mais JavaScript les traite différemment dans certains cas en fonction de la valeur de l'attribut configurable
décrit ci-dessous). En utilisation régulière, ils devraient se comporter de la même manière.
Vous trouverez ci-dessous des comparaisons de variables _ (déclaréeset non déclaréesglobales.
var declared = 1; // Explicit global variable (new variable)
undeclared = 1; // Implicit global variable (property of default global object)
window.hasOwnProperty('declared') // true
window.hasOwnProperty('undeclared') // true
window.propertyIsEnumerable('declared') // true
window.propertyIsEnumerable('undeclared') // true
window.declared // 1
window.undeclared // 1
window.declared = 2;
window.undeclared = 2;
declared // 2
undeclared // 2
delete declared // false
delete undeclared // true
delete undeclared // true (same result if delete it again)
delete window.declared // false
delete window.undeclared // true (same result if delete it yet again)
delete window.undeclared // true (still true)
Les deux variables déclaréeset undeclaredglobal) sont des propriétés de l'objet window
l'objet global par défaut). Aucune des deux n'est héritée d'un autre objet via la chaîne de prototypes. Elles existent toutes deux directement dans l'objet window
(depuis window.hasOwnProperty
retourne true
pour les deux).
Pour _ (déclarévariables globales, l'attribut configurable
est false
. Pour non déclarévariables globales, il s'agit de true
. La valeur de l'attribut configurable
peut être extraite à l'aide de la méthode getOwnPropertyDescriptor
, comme indiqué ci-dessous.
var declared = 1;
undeclared = 1;
(Object.getOwnPropertyDescriptor(window, 'declared')).configurable // false
(Object.getOwnPropertyDescriptor(window, 'undeclared')).configurable // true
Si l'attribut configurable
d'une propriété est true, vous pouvez modifier ses attributs à l'aide de la méthode defineProperty
et supprimer la propriété à l'aide de l'opérateur delete
. Sinon, les attributs ne peuvent pas être modifiés et la propriété ne peut pas être supprimée de cette manière.
Dans mode non strict , l'opérateur delete
renvoie true
si la propriété est configurable et false
si elle n'est pas configurable.
Variable globale déclarée
window
)delete
Variable globale non déclarée
window
)delete
La principale différence est lorsque vous déclarez des variables dans une fonction. Si vous utilisez var
lorsque vous déclarez une variable dans une fonction, cette variable devient une variable locale. Toutefois, si vous n'utilisez pas var
, la variable devient une variable globale, où que vous le déclariez (à l'intérieur ou à l'extérieur d'une fonction).
Lorsqu'une variable est créée via Déclaration de variable dans JavaScript , ces propriétés sont créées avec l'attribut " DontDelete ", ce qui signifie que cette variable ne peut pas être supprimée à l'aide de l'expression "delete". Toutes les fonctions, arguments et paramètres de fonction par défaut sont créés avec cet attribut DontDelete. Vous pouvez considérer DontDelete comme un drapeau.
var y = 43;
delete y; //returns false because it is has a DontDelete attribute
Tandis que l'affectation non déclarée ne définit aucun attribut tel que DontDelete . Ainsi, lorsque nous appliquons delete operator sur cette variable non déclarée, elle renvoie true.
x = 42;
delete x; //returns true because it doesn't have a DontDelete attribute
La différence entre l’attribution de propriété et la déclaration de variable - la dernière définit DontDelete, alors que la première ne le fait pas. C'est pourquoi l'affectation non déclarée crée une propriété pouvant être supprimée.
Lien sur le fonctionnement exact de l'opérateur de suppression
la suppression n'est effective que sur les propriétés d'un objet. Cela n'a aucun effet sur les noms de variables ou de fonctions.
Dans votre cas, x = 42; déclare la variable X et en fait la propriété de l'objet Global. Donc, cela retourne vrai.
Et var y = 43; déclare une variable globale qui ne fait partie d'aucun objet et renvoie donc false.