L' delete
opérateur supprime une propriété d'un objet. Il ne peut pas supprimer une variable. La réponse à la question dépend donc de la façon dont la variable ou la propriété globale est définie.
(1) S'il est créé avec var
, il ne peut pas être supprimé.
Par exemple:
var g_a = 1; //create with var, g_a is a variable
delete g_a; //return false
console.log(g_a); //g_a is still 1
(2) S'il est créé sans var
, il peut être supprimé.
g_b = 1; //create without var, g_b is a property
delete g_b; //return true
console.log(g_b); //error, g_b is not defined
Explication technique
1. Utilisation var
Dans ce cas, la référence g_a
est créée dans ce que la spécification ECMAScript appelle " VariableEnvironment " qui est attaché à la portée actuelle - cela peut être le contexte d'exécution d'une fonction dans le cas de l'utilisation à l' var
intérieur d'une fonction (bien que cela puisse être un peu plus compliqué). quand on considère let
) ou dans le cas du code "global", VariableEnvironment est attaché à l'objet global (souvent window
).
Les références dans VariableEnvironment ne sont normalement pas supprimables - le processus détaillé dans ECMAScript 10.5 explique cela en détail, mais il suffit de dire qu'à moins que votre code ne soit exécuté dans un eval
contexte (que la plupart des consoles de développement basées sur un navigateur utilisent), les variables déclarées avec var
ne peuvent pas être supprimé.
2. Sans utiliser var
Lorsque vous essayez d'attribuer une valeur à un nom sans utiliser le var
mot clé, Javascript essaie de localiser la référence nommée dans ce que la spécification ECMAScript appelle " LexicalEnvironment ", et la principale différence est que les LexicalEvironment sont imbriqués - c'est-à-dire qu'un LexicalEnvironment a un parent ( ce que la spécification ECMAScript appelle «référence d'environnement externe») et lorsque Javscript ne parvient pas à localiser la référence dans un environnement Lexical , il regarde dans l' environnement Lexical parent (comme détaillé en 10.3.1 et 10.2.2.1 ). Le plus haut niveau LexicalEnvironment est " l'environnement mondial", et qui est lié à l'objet global dans la mesure où ses références sont les propriétés de l'objet global. Donc, si vous essayez d'accéder à un nom qui n'a pas été déclaré à l'aide d'un var
mot clé dans la portée actuelle ou dans une portée externe, Javascript finira par récupérer une propriété de l' window
objet pour servir de référence. Comme nous l'avons vu précédemment, les propriétés des objets peuvent être supprimées.
Remarques
Il est important de se rappeler que les var
déclarations sont "hissées" - c'est-à-dire qu'elles sont toujours considérées comme étant survenues au début de la portée dans laquelle elles se trouvent - mais pas l'initialisation de la valeur qui peut être effectuée dans une var
instruction - qui reste là où elle est . Ainsi, dans le code suivant, a
est une référence de VariableEnvironment et non la window
propriété et sa valeur sera 10
à la fin du code:
function test() { a = 5; var a = 10; }
La discussion ci-dessus est lorsque le "mode strict" n'est pas activé. Les règles de recherche sont un peu différentes lors de l'utilisation du "mode strict" et les références lexicales qui auraient résolu les propriétés de la fenêtre sans "mode strict" déclencheront des erreurs "variable non déclarée" sous "mode strict". Je ne comprenais pas vraiment où cela est spécifié, mais son comportement des navigateurs.
var
dehors d'une fonction) sont des propriétés de "l'objet global", ce qui est le cas dans les navigateurs Webwindow
. Donc -var a = 1; delete window.a; console.log(a);
supprimera avec succès la variable et provoquera une erreur de référence sur la dernière ligne.var a = 1; delete window.a; console.log(a);
affiche 1.1
correctement dans tous les navigateurs. Fonctionnant dans de vrais documents, vos exemples de code sont corrects. J'ai choisi votre réponse comme correcte, mais j'apprécierais que vous puissiez la modifier pour inclure l'explicationwindow.a = 1; delete window.a;
et éventuellement le mécanisme. Je peux le faire aussi si cela ne vous dérange pas.La réponse de @ scunlife fonctionnera, mais techniquement, elle devrait être
delete est censé être un no-op lorsque la cible n'est pas une propriété d'objet. par exemple,
Mais puisque les variables globales sont en fait membres de l'objet window, cela fonctionne.
Lorsque des chaînes de prototypes sont impliquées, l'utilisation de la suppression devient plus complexe car elle supprime uniquement la propriété de l'objet cible, et non du prototype. par exemple,
Donc sois prudent.
EDIT: Ma réponse est quelque peu inexacte (voir "Idées fausses" à la fin). Le lien explique tous les détails sanglants, mais le résumé est qu'il peut y avoir de grandes différences entre les navigateurs et selon l'objet que vous supprimez.
delete object.someProp
devrait généralement être sûr aussi longtemps queobject !== window
. Je ne l'utiliserais toujours pas pour supprimer les variables déclarées avecvar
bien que vous puissiez dans les bonnes circonstances.la source
var
est lorsque la variable a été déclarée aveceval
.Si vous déclarez implicitement la variable sans
var
, la bonne façon serait d'utiliserdelete foo
.Cependant, après l'avoir supprimé, si vous essayez de l'utiliser dans une opération telle que l'ajout, un
ReferenceError
sera levé car vous ne pouvez pas ajouter de chaîne à un identifiant non déclaré et non défini. Exemple:Il peut être plus sûr dans certaines situations de l'affecter à false, null ou indéfini afin qu'il soit déclaré et ne génère pas ce type d'erreur.
Notez que dans ECMAScript
null
,false
,undefined
,0
,NaN
ou''
serait tout à évaluerfalse
. Assurez-vous simplement que vous n'utilisez pas l'!==
opérateur mais à la place!=
lors de la vérification de type pour les booléens et que vous ne voulez pas de vérification d'identité (comme lenull
ferait== false
etfalse == undefined
).Notez également que
delete
ne "supprime" pas les références mais seulement les propriétés directement sur l'objet, par exemple:Si vous avez déclaré une variable avec
var
vous ne pouvez pas la supprimer:Dans Rhino:
Vous ne pouvez pas non plus supprimer certaines propriétés prédéfinies comme
Math.PI
:Il y a quelques exceptions étranges à
delete
comme avec n'importe quelle langue, si vous vous souciez suffisamment, vous devriez lire:la source
la source
delete
.delete
ne fonctionne que pour une propriété. Ennull
la définissant, la variable existe toujours.TLDR: simples variables définies par (sans
var
,let
,const
) pourrait être supprimé avecdelete
. Si vous utilisezvar
,let
,const
- ils ne pouvaient pas être supprimés ni avecdelete
ni avecReflect.deleteProperty
.Chrome 55:
FF Nightly 53.0a1 montre le même comportement.
la source
var
cas. Quant à moi, c'était intéressant de tester et de partagerlet
ainsi que desconst
cas. Cependant, merci pour la note. J'essaierai d'être plus précis la prochaine fois.ECMAScript 2015 propose l'API Reflect. Il est possible de supprimer la propriété d'objet avec Reflect.deleteProperty () :
Pour supprimer la propriété d'un
window
objet global :Dans certains cas, les propriétés ne peuvent pas être supprimées (lorsque la propriété n'est pas configurable), puis cette fonction revient
false
(ainsi que l' opérateur de suppression ). Dans les autres cas, retournetrue
:Il y a une différence entre la
deleteProperty
fonction et l'delete
opérateur lorsqu'il est exécuté en mode strict:la source
Les variables, contrairement aux propriétés simples, ont l'attribut [[Configurable]] , ce qui signifie l'impossibilité de supprimer une variable via l' opérateur de suppression . Cependant, il existe un contexte d'exécution sur lequel cette règle n'affecte pas. C'est le contexte eval : l'attribut [[Configurable]] n'est pas défini pour les variables.
la source
L'opérateur de suppression supprime une propriété d'un objet.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
Selon la question, vous avez besoin de l'un des éléments suivants
la source
En plus de ce que tout le monde avait écrit, notons également que les
delete
retours booléens. Il peut vous dire si la suppression a réussi ou non.Test sur Chrome, tout sauf
let
était délassable. une foisdelete
retourné,true
il les supprimait:la source
let
vars etconst
vars, il renvoie vrai ce qui devrait signifier que la variable a été supprimée mais ce n'est pas le cas. Vous pouvez le vérifier dans Chrome et FF. FF semble renvoyer des valeurs correctes alors que Chrome ne l'est pas. Alors ne savez pas que vous pouvez vraiment compter dessus. Voyons:let letVar = "1"; undefined delete letVar; true letVar "1" typeof letVar; "string" const constVar="1"; undefined delete constVar; true constVar; "1" typeof constVar; "string"
delete
fonctionne l'opérateur. Mais il ne décrit pas pourquoi la situation est littéralement opposée aux fonctions. Dommage. Cependant, en ce qui concerne les variables, les choses commencent à sembler beaucoup plus claires.Vous ne pouvez pas supprimer une variable si vous l'avez déclarée (avec var x;) au moment de la première utilisation. Cependant, si votre variable x est apparue pour la première fois dans le script sans déclaration, alors vous pouvez utiliser l'opérateur de suppression (delete x;) et votre variable sera supprimée, très similaire à la suppression d'un élément d'un tableau ou la suppression d'une propriété d'un objet .
la source
Je suis un peu confus. Si tout ce que vous voulez, c'est qu'une valeur de variable ne passe pas à un autre script, il n'est pas nécessaire de supprimer la variable de la portée. Annulez simplement la variable puis vérifiez explicitement si elle est ou non nulle. Pourquoi se donner la peine de supprimer la variable de la portée? À quoi sert ce serveur qui annulant ne peut pas?
la source
null
valeur que je ne veux pas déclencher.<?php if(isset($_POST['somevariable']) unset($_POST['somevariable']); if(isset($_GET['somevariable']) unset($_GET['somevariable']); ?>