Как удалить переменную в JavaScript?
Я столкнулся с проблемой в JavaScript, связанной с глобальной переменной (фактически, это свойство window
, но я не думаю, что это имеет значение). Эта переменная уже была заполнена предыдущим скриптом, но я не хочу, чтобы другой скрипт, который будет выполняться позже, имел доступ к её значению или даже знал о том, что она была определена.
Я пробовал использовать some_var = undefined
, и это работает для проверки typeof some_var == "undefined"
, но мне кажется, что это не самый подходящий способ решения проблемы.
Что вы думаете об этом? Как лучше скрыть или удалить значение глобальной переменной, чтобы следующие скрипты её не видели?
5 ответ(ов)
Если вы неявно объявляете переменную без var
, правильным способом будет использование delete foo
.
Однако после удаления, если вы попытаетесь использовать её в операции, такой как сложение, будет выброшена ошибка ReferenceError
, так как нельзя сложить строку с undeclared, undefined идентификатором. Пример:
x = 5;
delete x;
alert('foo' + x);
// ReferenceError: x is not defined
В некоторых ситуациях безопаснее будет присвоить переменной значение false
, null
или undefined
, чтобы она была объявлена и не вызывала подобную ошибку.
foo = false;
Обратите внимание, что в ECMAScript значения null
, false
, undefined
, 0
, NaN
и ''
все будут оцениваться как false
. Просто убедитесь, что вы не используете оператор !==
, а вместо этого используете !=
, когда проверяете тип для булевых значений и вам не нужно строгое сравнение (так, null
будет == false
, а false == undefined
).
Также стоит отметить, что оператор delete
не "удаляет" ссылки, а просто удаляет свойства непосредственно на объекте. Например:
bah = {}, foo = {}; bah.ref = foo;
delete bah.ref;
alert([bah.ref, foo]);
// ,[object Object] (удалено свойство, но ссылка на другой объект осталась)
Если вы объявили переменную с помощью var
, вы не можете её удалить:
(function() {
var x = 5;
alert(delete x);
// false
})();
В Rhino:
js> var x;
js> delete x;
false
Также вы не можете удалить некоторые заранее определённые свойства, такие как Math.PI
:
js> delete Math.PI;
false
Существуют странные исключения для операции delete
, как и в любом языке, поэтому если вас это действительно интересует, вам следует ознакомиться с:
TL;DR: Простые определённые переменные (без использования var
, let
, const
) можно удалить с помощью delete
. Если вы используете var
, let
или const
, их нельзя удалить ни с помощью delete
, ни с помощью Reflect.deleteProperty
.
В Chrome 55:
simpleVar = "1"; // простая переменная
"1"
delete simpleVar; // удаляем простую переменную
true
simpleVar; // пытаемся получить доступ к переменной
VM439:1 Uncaught ReferenceError: simpleVar is not defined
at <anonymous>:1:1
(anonymous) @ VM439:1
var varVar = "1"; // переменная, объявленная с var
undefined
delete varVar; // пытаемся удалить var переменную
false
varVar; // доступ к переменной
"1"
let letVar = "1"; // переменная, объявленная с let
undefined
delete letVar; // пытаемся удалить let переменную
false
letVar; // доступ к переменной
"1"
const constVar = "1"; // переменная, объявленная с const
undefined
delete constVar; // пытаемся удалить const переменную
false
constVar; // доступ к переменной
"1"
Reflect.deleteProperty(window, "constVar"); // удаляем const переменную
false
constVar; // доступ к переменной
"1"
Reflect.deleteProperty(window, "varVar"); // удаляем var переменную
false
varVar; // доступ к переменной
"1"
Reflect.deleteProperty(window, "letVar"); // удаляем let переменную
false
letVar; // доступ к переменной
"1"
Firefox Nightly 53.0a1 демонстрирует то же поведение.
Обратите внимание, что оператор delete
возвращает true
, если удаление прошло успешно.
Обновление 2021: протестировано на Chrome 88 и Firefox 84:
implicit_global = 1;
delete implicit_global; // true
window.explicit_global = 1;
delete explicit_global; // true
const _object = {property: 1};
delete _object.property; // true
function_set = function() {};
delete function_set; // true
function function_declaration() {};
delete function_declaration; // false
(function () {
var _var = 1;
console.log(delete _var); // false
console.log(_var); // 1
})()
(function () {
let _let = 1;
console.log(delete _let); // false
console.log(_let); // 1
})()
(function () {
const _const = 1;
console.log(delete _const); // false
console.log(_const); // 1
})()
Предыдущее обновление этого ответа больше не актуально из-за обновлений браузеров.
Переменные, в отличие от простых свойств, имеют атрибут [[Configurable]], что означает невозможность удалить переменную с помощью оператора delete.
Тем не менее, существует один контекст выполнения, который не подпадает под это правило. Это контекст eval: в нем атрибут [[Configurable]] не устанавливается для переменных.
Оператор delete
удаляет свойство из объекта в JavaScript.
Для удаления свойства объекта можно использовать два синтаксиса:
delete object.property;
delete object['property'];
Если вы хотите удалить переменную или свойство глобального объекта window
, вы можете использовать один из следующих вариантов:
delete some_var; // удаляет переменную 'some_var', если она не объявлена через 'var', 'let' или 'const'
delete window.some_var; // удаляет свойство 'some_var' из объекта 'window'
delete window['some_var']; // тоже самое, но с использованием квадратных скобок
Обратите внимание, что оператор delete
не удалит переменные, созданные с помощью var
, let
или const
, а также не удалит свойства, которые не являются настраиваемыми. Для получения дополнительной информации, вы можете ознакомиться с документацией MDN.
Как проверить "undefined" в JavaScript?
Как определить, является ли переменная 'undefined' или 'null'?
Проверка существования переменной в JavaScript (определена/инициализирована)
Как проверить неопределённую переменную в JavaScript
Почему null является объектом и в чем разница между null и undefined?