delete
Operator usuwa własności z obiektu. Nie można usunąć zmiennej. Odpowiedź na pytanie zależy więc od sposobu zdefiniowania zmiennej globalnej lub właściwości.
(1) Jeśli jest utworzony var
, nie można go usunąć.
Na przykład:
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) Jeśli zostanie utworzony bez var
, można go usunąć.
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
Wyjaśnienie techniczne
1. Korzystanie var
W tym przypadku odwołanie g_a
jest tworzone w tym, co specyfikacja ECMAScript nazywa „ VariableEnvironment ”, które jest dołączone do bieżącego zakresu - może to być kontekst wykonania funkcji w przypadku użycia var
wewnątrz funkcji (choć może być nieco bardziej skomplikowany jeśli weźmiesz pod uwagę let
) lub w przypadku kodu „globalnego” środowisko zmienne jest dołączane do obiektu globalnego (często window
).
Odwołania w środowisku VariableEnvironment zwykle nie są usuwalne - proces szczegółowo opisany w ECMAScript 10.5 wyjaśnia to szczegółowo, ale wystarczy powiedzieć, że jeśli twój kod nie jest wykonywany w eval
kontekście (z którego korzysta większość konsol programistycznych opartych na przeglądarce), to zmienne zadeklarowane za var
pomocą nie mogą zostać usunięte.
2. Bez użycia var
Gdy próbuje przypisać wartość do nazwy bez użycia var
słowa kluczowego, JavaScript próbuje zlokalizować nazwie odniesienie w nazywa ECMAScript Spec „ LexicalEnvironment ”, a główną różnicą jest to, że LexicalEvironment s są zagnieżdżone - czyli LexicalEnvironment ma rodzica ( co specyfikacja ECMAScript nazywa „referencją środowiska zewnętrznego”), a gdy Javscript nie może zlokalizować referencji w środowisku LexicalEenvironment , sprawdza je w macierzystym środowisku LexicalEnvironment (jak szczegółowo opisano w 10.3.1 i 10.2.2.1 ). LexicalEnvironment najwyższego poziomu to „ środowisko globalne”, a to jest powiązane z obiektem globalnym, ponieważ jego odwołania są właściwościami obiektu globalnego. Jeśli więc spróbujesz uzyskać dostęp do nazwy, która nie została zadeklarowana przy użyciu var
słowa kluczowego w bieżącym zakresie lub jakimkolwiek zasięgu zewnętrznym, JavaScript ostatecznie pobierze właściwość z window
obiektu, aby służyć jako tego odniesienia. jak dowiedzieliśmy się wcześniej, na właściwości obiektów mogą zostać usunięte.
Notatki
Ważne jest, aby pamiętać, że var
deklaracje są „podnoszone” - tzn. Zawsze uważa się, że miały miejsce na początku zakresu, w którym się znajdują - choć nie inicjalizacja wartości, którą można wykonać w var
instrukcji - pozostawia się tam, gdzie jest . Zatem w poniższym kodzie a
znajduje się odwołanie z VariableEnvironment, a nie window
właściwość, a jego wartość będzie 10
na końcu kodu:
function test() { a = 5; var a = 10; }
Powyższa dyskusja dotyczy sytuacji, gdy „tryb ścisły” nie jest włączony. Reguły wyszukiwania są nieco inne, gdy używa się „trybu ścisłego”, a odniesienia leksykalne, które zostałyby rozstrzygnięte we właściwościach okna bez „trybu ścisłego”, spowodują błędy „niezadeklarowanej zmiennej” w „trybie ścisłym”. Naprawdę nie rozumiałem, gdzie to jest określone, ale jak działają przeglądarki.
var
poza funkcją) są właściwościami „obiektu globalnego”, jakim jest w przeglądarkach internetowychwindow
. Tak więc -var a = 1; delete window.a; console.log(a);
z powodzeniem usunie zmienną i spowoduje błąd referencyjny w ostatnim wierszu.var a = 1; delete window.a; console.log(a);
wyświetla 1.1
poprawnie wyświetlany we wszystkich przeglądarkach. Przykłady kodu działające w rzeczywistych dokumentach są poprawne. Wybrałem twoją odpowiedź jako poprawną, ale byłbym wdzięczny, jeśli możesz ją edytować, aby zawierała wyjaśnieniewindow.a = 1; delete window.a;
i ewentualnie mechanizm. Mogę to również zrobić, jeśli nie masz nic przeciwko.Odpowiedź @ scunlife zadziała, ale technicznie powinna być
delete ma być opcją, gdy cel nie jest właściwością obiektu. na przykład,
Ale ponieważ zmienne globalne są faktycznie elementami obiektu okna, działa.
Gdy zaangażowane są łańcuchy prototypów, użycie delete staje się bardziej złożone, ponieważ usuwa tylko właściwość z obiektu docelowego, a nie prototypu. na przykład,
Więc uważaj.
EDYCJA: Moja odpowiedź jest nieco niedokładna (patrz „Błędne przekonania” na końcu). Link wyjaśnia wszystkie krwawe szczegóły, ale podsumowanie jest takie, że mogą istnieć duże różnice między przeglądarkami i w zależności od obiektu, z którego usuwasz.
delete object.someProp
powinny być ogólnie bezpieczne, o ileobject !== window
. Nadal nie używałbym tego do usuwania zadeklarowanych zmiennych,var
chociaż można to zrobić w odpowiednich okolicznościach.źródło
var
jest moment zadeklarowania zmiennejeval
.Jeśli domyślnie deklarujesz zmienną bez
var
, właściwym sposobem byłoby użyciedelete foo
.Jednak po jego usunięciu próba użycia tego w operacji, takiej jak dodawanie,
ReferenceError
spowoduje wyrzucenie, ponieważ nie można dodać ciągu do niezadeklarowanego, niezdefiniowanego identyfikatora. Przykład:W niektórych sytuacjach bezpieczniejsze może być przypisanie go do wartości false, null lub undefined, aby został zadeklarowany i nie generował tego typu błędu.
Należy zauważyć, że w ECMAScript
null
,false
,undefined
,0
,NaN
, lub''
by wszystko aby ocenićfalse
. Po prostu upewnij się, że nie używasz!==
operatora, ale zamiast tego!=
podczas sprawdzania typu dla booleanów i nie chcesz sprawdzania tożsamości (taknull
by== false
ifalse == undefined
).Należy również pamiętać, że
delete
nie „usuwa” odniesień, a jedynie właściwości bezpośrednio na obiekcie, np .:Jeśli zadeklarowałeś zmienną
var
, nie możesz jej usunąć:W nosorożcu:
Nie można również usunąć niektórych predefiniowanych właściwości, takich jak
Math.PI
:Istnieją pewne dziwne wyjątki,
delete
jak w każdym języku, jeśli dbasz wystarczająco, powinieneś przeczytać:źródło
źródło
delete
.delete
działa tylko dla nieruchomości. Ustawienienull
tej zmiennej wciąż istnieje.TLDR: proste zdefiniowane zmienne (bez
var
,let
,const
) może być usunięty zdelete
. Jeśli używaszvar
,let
,const
- nie mogli być usunięte ani zdelete
aniReflect.deleteProperty
.Chrome 55:
FF Nightly 53.0a1 pokazuje to samo zachowanie.
źródło
var
przypadku. Dla mnie interesujące było testowanie, udostępnianielet
iconst
przypadki. Dziękuję za uwagę. Spróbuję być bardziej szczegółowy następnym razem.ECMAScript 2015 oferuje API Reflect. Możliwe jest usunięcie właściwości obiektu za pomocą Reflect.deleteProperty () :
Aby usunąć właściwość
window
obiektu globalnego :W niektórych przypadkach właściwości nie można usunąć (gdy właściwości nie można skonfigurować), a następnie funkcja ta zwraca
false
(podobnie jak operator usuwania ). W innych przypadkach zwracatrue
:W trybie ścisłym istnieje różnica między
deleteProperty
funkcją adelete
operatorem:źródło
Zmienne, w przeciwieństwie do prostych właściwości, mają atrybut [[Konfigurowalny]] , co oznacza niemożność usunięcia zmiennej za pomocą operatora delete . Istnieje jednak jeden kontekst wykonania, na który ta reguła nie ma wpływu. Jest to kontekst ewaluacyjny : dla zmiennych nie ustawiono atrybutu [[Konfigurowalny]].
źródło
Operator usuwania usuwa właściwość z obiektu.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
Zgodnie z pytaniem potrzebujesz jednego z poniższych
źródło
Oprócz tego, co wszyscy napisali, zauważ również, że
delete
zwraca wartość logiczną. Może ci powiedzieć, czy usunięcie się powiodło, czy nie.Testując na Chrome, wszystko oprócz można
let
było usunąć. podelete
zwróceniutrue
faktycznie je usunął:źródło
let
Vars iconst
vars to wraca prawda, co oznacza, że zmienna powinna usunięty, ale tak nie jest. Możesz to sprawdzić zarówno w Chrome, jak i FF. FF wydaje się zwracać prawidłowe wartości, podczas gdy Chrome nie. Więc nie wiem, czy naprawdę możesz na tym polegać. Zobaczmy: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
działa operator. Ale nie opisuje, dlaczego dosłownie przeciwstawia się sytuacji z funkcjami. Szkoda. Jednak w odniesieniu do zmiennych rzeczy zaczynają się wydawać znacznie wyraźniejsze.Nie możesz usunąć zmiennej, jeśli zadeklarowałeś ją (przy pomocy var x;) podczas pierwszego użycia. Jeśli jednak twoja zmienna x pojawiła się po raz pierwszy w skrypcie bez deklaracji, możesz użyć operatora delete (delete x;), a twoja zmienna zostanie usunięta, bardzo podobnie do usuwania elementu tablicy lub usuwania właściwości obiektu .
źródło
Jestem trochę zmieszany. Jeśli wszystko, czego potrzebujesz, to aby zmienne nie były przekazywane do innego skryptu, nie ma potrzeby usuwania zmiennej z zakresu. Po prostu zeruj zmienną, a następnie jawnie sprawdź, czy jest ona zerowa. Po co męczyć się z usuwaniem zmiennej z zakresu? W jakim celu nie może tego serwera anulować?
źródło
null
wartość, której nie chcę wyzwalać.<?php if(isset($_POST['somevariable']) unset($_POST['somevariable']); if(isset($_GET['somevariable']) unset($_GET['somevariable']); ?>