delete
Оператор удаляет свойство из объекта. Он не может удалить переменную. Таким образом, ответ на вопрос зависит от того, как определяется глобальная переменная или свойство.
(1) Если он создан с помощью var
, он не может быть удален.
Например:
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) Если он создан без var
, его можно удалить.
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
Техническое объяснение
1. Использование var
В этом случае ссылка g_a
создается в том, что спецификация ECMAScript называет « VariableEnvironment », которая присоединена к текущей области - это может быть контекст выполнения функции в случае использования var
внутри функции (хотя это может быть немного сложнее если учитывать let
) или в случае «глобального» кода VariableEnvironment присоединяется к глобальному объекту (часто window
).
Ссылки в VariableEnvironment обычно не удаляются - процесс, подробно описанный в ECMAScript 10.5, объясняет это подробно, но достаточно сказать, что если ваш код не выполняется в eval
контексте (который используется большинством браузерных консолей разработки), то переменные, объявленные с var
помощью, не могут быть удаленным.
2. Без использования var
При попытке присвоить значение имени без использования var
ключевого слова Javascript пытается найти именованную ссылку в том, что спецификация ECMAScript называет « LexicalEnvironment », и основное отличие заключается в том, что элементы LexicalEvironment являются вложенными - то есть LexicalEnvironment имеет родителя ( то, что спецификация ECMAScript называет «ссылкой на внешнюю среду»), и когда Javscript не удается найти ссылку в LexicalEenvironment , он ищет в родительской среде LexicalEnvironment (как подробно описано в 10.3.1 и 10.2.2.1 ). Верхний уровень LexicalEnvironment - это « глобальная среда»", и это связано с глобальным объектом в том смысле, что его ссылки являются свойствами глобального объекта. Поэтому, если вы попытаетесь получить доступ к имени, которое не было объявлено с использованием var
ключевого слова в текущей области или каких-либо внешних областях, Javascript в конечном итоге получит свойство от window
объекта , чтобы служить этой ссылке. Как мы узнали ранее, свойства на объекты могут быть удалены.
Ноты
Важно помнить, что var
объявления «подняты», т. Е. Всегда считается, что они произошли в начале области действия, в которой они находятся, - но не при инициализации значения, которое может быть выполнено в var
операторе, - который остается там, где он находится. , Таким образом, в следующем коде a
это ссылка из VariableEnvironment, а не window
свойство, и его значение будет 10
в конце кода:
function test() { a = 5; var a = 10; }
Обсуждение выше, когда «строгий режим» не включен. Правила поиска немного отличаются при использовании «строгого режима», и лексические ссылки, которые разрешались бы в свойствах окна без «строгого режима», приводят к ошибкам «необъявленная переменная» в «строгом режиме». Я не совсем понял, где это указано, но как ведут себя браузеры.
var
вне функции), являются свойствами "глобального объекта", который есть в веб-браузерахwindow
. Так что -var a = 1; delete window.a; console.log(a);
удалит переменную и заставит последнюю строку выдать ошибку ссылки.var a = 1; delete window.a; console.log(a);
отображает 1.1
корректно выводиться во всех браузерах. Работая в реальных документах, ваши примеры кода верны. Я выбрал ваш ответ как правильный, но я был бы признателен, если бы вы могли отредактировать его, включив поясненияwindow.a = 1; delete window.a;
и, возможно, механизм. Я тоже могу это сделать, если ты не против.Ответ @ scunlife сработает, но технически это должно быть
Предполагается, что delete не используется, если цель не является свойством объекта. например,
Но поскольку глобальные переменные на самом деле являются членами объекта window, это работает.
Когда задействованы цепочки прототипов, использование delete становится более сложным, поскольку оно удаляет только свойство из целевого объекта, а не прототип. например,
Так что будь осторожен.
РЕДАКТИРОВАТЬ: Мой ответ несколько неточный (см. «Заблуждения» в конце). Ссылка объясняет все кровавые подробности, но в итоге можно сказать, что между браузерами могут быть большие различия в зависимости от объекта, из которого вы удаляете.
delete object.someProp
как правило, должны быть в безопасности, покаobject !== window
. Я все еще не использовал бы это, чтобы удалить переменные, объявленные с,var
хотя вы можете при правильных обстоятельствах.источник
var
- это когда переменная была объявлена сeval
.Если вы неявно объявляете переменную без
var
, правильным способом будет использованиеdelete foo
.Однако после его удаления, если вы попытаетесь использовать это в такой операции, как добавление,
ReferenceError
будет брошено, потому что вы не можете добавить строку в необъявленный, неопределенный идентификатор. Пример:В некоторых ситуациях может быть безопаснее присвоить ему значение false, null или undefined, чтобы оно было объявлено и не выдавало этот тип ошибки.
Обратите внимание , что в ECMAScript
null
,false
,undefined
,0
,NaN
, или''
бы все вычислятьсяfalse
. Просто убедитесь, что вы не используете!==
оператор, а вместо этого!=
при проверке типа для логических значений, и вы не хотите, чтобы проверка идентичности (такnull
будет== false
иfalse == undefined
).Также обратите внимание, что
delete
ссылки не «удаляются», а только свойства непосредственно на объекте, например:Если вы объявили переменную,
var
вы не можете ее удалить:В носороге:
Также вы не можете удалить некоторые предопределенные свойства, такие как
Math.PI
:Есть некоторые странные исключения,
delete
как и в случае с любым другим языком, если вы достаточно внимательны, вы должны прочитать:источник
источник
delete
.delete
работает только на недвижимость. Устанавливая этоnull
переменная все еще существует.TLDR: просто определенные переменные (без
var
,let
,const
) может быть удален сdelete
. Если вы используетеvar
,let
,const
- они не могут быть удалены ни сdelete
ни сReflect.deleteProperty
.Chrome 55:
FF Nightly 53.0a1 показывает то же самое поведение.
источник
var
случай. Что касается меня, то было интересно проверить и поделиться,let
а такжеconst
делами. Тем не менее, спасибо за внимание. Постараюсь быть более конкретным в следующий раз.ECMAScript 2015 предлагает Reflect API. Удалить свойство объекта можно с помощью Reflect.deleteProperty () :
Чтобы удалить свойство глобального
window
объекта:В некоторых случаях свойства не могут быть удалены (если свойство не конфигурируемо), и затем эта функция возвращает
false
(а также оператор удаления ). В других случаях возвращаетсяtrue
:Существует разница между
deleteProperty
функцией иdelete
оператором при работе в строгом режиме:источник
Переменные, в отличие от простых свойств, имеют атрибут [[Configurable]] , что означает невозможность удаления переменной с помощью оператора удаления . Однако есть один контекст выполнения, на который это правило не влияет. Это eval context: там атрибут [[Configurable]] не установлен для переменных.
источник
Оператор удаления удаляет свойство из объекта.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
По вопросу нужен один из следующих
источник
В дополнение к тому, что все написали, также обратите внимание, что
delete
возвращает логическое значение. Он может сказать вам, было ли удаление успешным или нет.Тестирование на Chrome, все, кроме
let
удаления. когдаdelete
вернулся,true
то фактически удалил их:источник
let
vars иconst
vars, он возвращает true, что должно означать, что переменная удалена, но это не так. Вы можете проверить это как в Chrome, так и в FF. FF возвращает правильные значения, а Chrome - нет. Так что не уверен, что вы могли бы действительно положиться на это. Давайте посмотрим: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
работает оператор. Но это не описание, почему буквально противоположная ситуация с функциями. Как жаль. Тем не менее, в отношении переменных вещи начинают казаться намного более ясными.Вы не можете удалить переменную, если вы объявили ее (с помощью var x;) во время первого использования. Однако, если ваша переменная x впервые появилась в скрипте без объявления, вы можете использовать оператор delete (delete x;), и ваша переменная будет удалена, что очень похоже на удаление элемента массива или удаление свойства объекта ,
источник
Я немного смущен. Если все, что вам нужно, это чтобы значение переменной не передавалось в другой сценарий, тогда нет необходимости удалять переменную из области. Просто обнулите переменную, а затем явно проверьте, является ли она нулевой. Зачем переживать проблему удаления переменной из области видимости? С какой целью этот сервер обнулять не может?
источник
null
значения, которое я не хочу вызывать.<?php if(isset($_POST['somevariable']) unset($_POST['somevariable']); if(isset($_GET['somevariable']) unset($_GET['somevariable']); ?>