Der delete
Operator entfernt eine Eigenschaft aus einem Objekt. Eine Variable kann nicht entfernt werden. Die Antwort auf die Frage hängt also davon ab, wie die globale Variable oder Eigenschaft definiert ist.
(1) Wenn es mit erstellt wurde var
, kann es nicht gelöscht werden.
Zum Beispiel:
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) Wenn es ohne erstellt wird var
, kann es gelöscht werden.
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
Technische Erklärung
1. Verwenden von var
In diesem Fall wird die Referenz g_a
in der ECMAScript-Spezifikation " VariableEnvironment " erstellt, die an den aktuellen Bereich angehängt ist. Dies kann der Kontext für die var
Funktionsausführung sein, wenn eine Funktion verwendet wird (obwohl dies etwas komplizierter werden kann) Wenn Sie dies berücksichtigen let
) oder im Fall von "globalem" Code wird die VariableEnvironment (häufig window
) an das globale Objekt angehängt .
Verweise in der Variablenumgebung sind normalerweise nicht löschbar - der in ECMAScript 10.5 beschriebene Prozess erklärt dies ausführlich, reicht jedoch aus, um zu sagen, dass eval
Variablen, mit denen die meisten browserbasierten Entwicklungskonsolen deklariert var
sind, nicht ausgeführt werden können, sofern Ihr Code nicht in einem Kontext ausgeführt wird (den die meisten browserbasierten Entwicklungskonsolen verwenden) gelöscht werden.
2. Ohne zu verwenden var
Beim Versuch, einem Namen einen Wert zuzuweisen, ohne das var
Schlüsselwort zu verwenden, versucht Javascript, die benannte Referenz in der ECMAScript-Spezifikation " LexicalEnvironment " zu finden. Der Hauptunterschied besteht darin, dass LexicalEvironments verschachtelt sind - das heißt, LexicalEnvironment hat ein übergeordnetes Element ( Was die ECMAScript-Spezifikation als "Referenz für die äußere Umgebung" bezeichnet) und wenn Javscript die Referenz in einer LexicalEenvironment nicht findet , wird sie in der übergeordneten LexicalEnvironment angezeigt (wie in 10.3.1 und 10.2.2.1 beschrieben ). Die LexicalEnvironment der obersten Ebene ist die " globale Umgebung"", und das ist an das globale Objekt gebunden, da seine Referenzen die Eigenschaften des globalen Objekts sind. Wenn Sie also versuchen, auf einen Namen zuzugreifen, der nicht mit einem var
Schlüsselwort im aktuellen Bereich oder einem äußeren Bereich deklariert wurde, ruft Javascript schließlich eine Eigenschaft ab des window
Objekts als dieser Referenz zu dienen. wie wir bereits gelernt haben, Eigenschaften auf Objekte gelöscht werden können.
Anmerkungen
Es ist wichtig, sich daran zu erinnern, dass var
Deklarationen "gehisst" werden - dh sie werden immer als am Anfang des Bereichs betrachtet betrachtet, in dem sie sich befinden - obwohl nicht die Wertinitialisierung, die in einer var
Anweisung durchgeführt werden kann -, die dort belassen wird, wo sie ist . Im folgenden Code a
befindet sich also eine Referenz aus der Variablenumgebung und nicht die window
Eigenschaft, und ihr Wert befindet sich 10
am Ende des Codes:
function test() { a = 5; var a = 10; }
Die obige Diskussion ist, wenn "strikter Modus" nicht aktiviert ist. Suchregeln sind etwas anders, wenn der "strenge Modus" verwendet wird, und lexikalische Verweise, die ohne "strengen Modus" in Fenstereigenschaften aufgelöst worden wären, führen im "strengen Modus" zu Fehlern bei "nicht deklarierten Variablen". Ich habe nicht wirklich verstanden, wo dies angegeben ist, aber wie sich Browser verhalten.
var
außerhalb einer Funktion), sind Eigenschaften des "globalen Objekts", das in Webbrowsern verwendet wirdwindow
. Also -var a = 1; delete window.a; console.log(a);
löscht die Variable erfolgreich und bewirkt, dass in der letzten Zeile ein Referenzfehler ausgegeben wird.var a = 1; delete window.a; console.log(a);
zeigt 1.1
in allen Browsern korrekt ausgegeben . Ihre Codebeispiele laufen in realen Dokumenten und sind korrekt. Ich habe Ihre Antwort als richtig ausgewählt, aber ich würde es begrüßen, wenn Sie sie bearbeiten können, um Erklärungenwindow.a = 1; delete window.a;
und möglicherweise den Mechanismus einzuschließen. Ich kann das auch, wenn es Ihnen nichts ausmacht.Die Antwort von @ scunlife wird funktionieren, aber technisch sollte es sein
Löschen soll ein No-Op sein, wenn das Ziel keine Objekteigenschaft ist. z.B,
Da globale Variablen jedoch tatsächlich Mitglieder des Fensterobjekts sind, funktioniert dies.
Wenn Prototypketten beteiligt sind, wird die Verwendung von delete komplexer, da nur die Eigenschaft aus dem Zielobjekt und nicht aus dem Prototyp entfernt wird. z.B,
Also sei vorsichtig.
EDIT: Meine Antwort ist etwas ungenau (siehe "Missverständnisse" am Ende). Der Link erklärt alle wichtigen Details, aber die Zusammenfassung ist, dass es große Unterschiede zwischen Browsern geben kann und abhängig von dem Objekt, aus dem Sie löschen.
delete object.someProp
sollte im Allgemeinen sicher sein, solangeobject !== window
. Ich würde es immer noch nicht verwenden, um Variablen zu löschen, mitvar
denen deklariert wurde, obwohl Sie dies unter den richtigen Umständen können.quelle
var
denen deklariert wurde, nur löschen, wenn die Variable mit deklariert wurdeeval
.Wenn Sie die Variable implizit ohne deklarieren
var
, ist der richtige Weg, sie zu verwendendelete foo
.Wenn Sie jedoch versuchen, dies in einem Vorgang wie dem Hinzufügen von a zu verwenden,
ReferenceError
wird nach dem Löschen a ausgelöst, da Sie einem nicht deklarierten, nicht definierten Bezeichner keine Zeichenfolge hinzufügen können. Beispiel:In einigen Situationen kann es sicherer sein, es false, null oder undefined zuzuweisen, damit es deklariert wird und diese Art von Fehler nicht auslöst.
Beachten Sie, dass in ECMAScript
null
,false
,undefined
,0
,NaN
, oder''
würde alles bewerten zufalse
. Stellen Sie nur sicher, dass Sie nicht den!==
Operator verwenden, sondern stattdessen!=
bei der Typprüfung auf Boolesche Werte und Sie möchten keine Identitätsprüfung (sonull
würde== false
undfalse == undefined
).Beachten Sie auch, dass
delete
keine Referenzen "gelöscht" werden, sondern nur Eigenschaften direkt auf dem Objekt, z.Wenn Sie eine Variable mit deklariert haben,
var
können Sie sie nicht löschen:In Rhino:
Sie können auch einige vordefinierte Eigenschaften wie
Math.PI
:Es gibt einige merkwürdige Ausnahmen
delete
wie bei jeder Sprache. Wenn Sie sich genug darum kümmern, sollten Sie lesen:quelle
quelle
delete
.delete
funktioniert nur für eine Immobilie. Das Einstellennull
der Variablen ist noch vorhanden.TLDR: einfach definierte Variablen (ohne
var
,let
,const
) konnte mit gelöscht werdendelete
. Wenn Sie ,, verwendenvar
,let
konntenconst
sie weder mitdelete
noch mit gelöscht werdenReflect.deleteProperty
.Chrome 55:
FF Nightly 53.0a1 zeigt das gleiche Verhalten.
quelle
var
Fall erwähnt. Wie war es für mich zu testen und mit anderen teilen interessantlet
undconst
auch Fälle. Vielen Dank für den Hinweis. Ich werde versuchen, das nächste Mal genauer zu sein.ECMAScript 2015 bietet Reflect API. Es ist möglich, Objekteigenschaften mit Reflect.deleteProperty () zu löschen :
So löschen Sie die Eigenschaft eines globalen
window
Objekts:In einigen Fällen können Eigenschaften nicht gelöscht werden (wenn die Eigenschaft nicht konfigurierbar ist), und dann kehrt diese Funktion zurück
false
(sowie der Löschoperator ). In anderen Fällen Rückgabetrue
:Im strengen Modus gibt es einen Unterschied zwischen
deleteProperty
Funktion unddelete
Bediener:quelle
Variablen haben im Gegensatz zu einfachen Eigenschaften das Attribut [[Konfigurierbar]] , was bedeutet, dass es unmöglich ist, eine Variable über den Löschoperator zu entfernen . Es gibt jedoch einen Ausführungskontext, auf den sich diese Regel nicht auswirkt. Dies ist der Bewertungskontext : Das Attribut [[Konfigurierbar]] ist für Variablen nicht festgelegt.
quelle
Der Löschoperator entfernt eine Eigenschaft aus einem Objekt.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
Entsprechend der Frage benötigen Sie eine der folgenden Möglichkeiten
quelle
Beachten Sie zusätzlich zu dem, was alle geschrieben haben, auch, dass
delete
Boolesche Werte zurückgegeben werden. Es kann Ihnen sagen, ob der Löschvorgang erfolgreich war oder nicht.Beim Testen auf Chrome war alles außer
let
löschbar. bei derdelete
Rückgabe wurdentrue
sie tatsächlich entfernt:quelle
let
vars undconst
vars betrifft, wird true zurückgegeben, was bedeuten sollte, dass die Variable gelöscht wurde, dies jedoch nicht. Sie können es sowohl in Chrome als auch in FF einchecken. FF scheint korrekte Werte zurückzugeben, Chrome jedoch nicht. Ich bin mir also nicht sicher, ob Sie sich wirklich darauf verlassen können. Mal sehen: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
Betreiber funktioniert. Aber es beschreibt nicht, warum buchstäblich eine Situation mit Funktionen entgegengesetzt ist. Schade. In Bezug auf Variablen scheinen die Dinge jedoch viel klarer zu sein.Sie können eine Variable nicht löschen, wenn Sie sie zum Zeitpunkt der ersten Verwendung (mit var x;) deklariert haben. Wenn Ihre Variable x jedoch zum ersten Mal ohne Deklaration im Skript angezeigt wurde, können Sie den Löschoperator (delete x;) verwenden. Ihre Variable wird gelöscht, ähnlich wie beim Löschen eines Elements eines Arrays oder beim Löschen einer Eigenschaft eines Objekts .
quelle
Ich bin etwas verwirrt. Wenn Sie lediglich möchten, dass ein Variablenwert nicht an ein anderes Skript übergeben wird, müssen Sie die Variable nicht aus dem Bereich löschen. Machen Sie die Variable einfach ungültig und prüfen Sie dann explizit, ob sie null ist oder nicht. Warum sollten Sie sich die Mühe machen, die Variable aus dem Gültigkeitsbereich zu löschen? Welchen Zweck hat dieser Server, den das Aufheben nicht kann?
quelle
null
Wert, den ich nicht auslösen möchte.<?php if(isset($_POST['somevariable']) unset($_POST['somevariable']); if(isset($_GET['somevariable']) unset($_GET['somevariable']); ?>