6

Как удалить переменную в JavaScript?

9

Я столкнулся с проблемой в JavaScript, связанной с глобальной переменной (фактически, это свойство window, но я не думаю, что это имеет значение). Эта переменная уже была заполнена предыдущим скриптом, но я не хочу, чтобы другой скрипт, который будет выполняться позже, имел доступ к её значению или даже знал о том, что она была определена.

Я пробовал использовать some_var = undefined, и это работает для проверки typeof some_var == "undefined", но мне кажется, что это не самый подходящий способ решения проблемы.

Что вы думаете об этом? Как лучше скрыть или удалить значение глобальной переменной, чтобы следующие скрипты её не видели?

5 ответ(ов)

0

Если вы неявно объявляете переменную без 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, как и в любом языке, поэтому если вас это действительно интересует, вам следует ознакомиться с:

0

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 демонстрирует то же поведение.

0

Обратите внимание, что оператор 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
})()

Предыдущее обновление этого ответа больше не актуально из-за обновлений браузеров.

0

Переменные, в отличие от простых свойств, имеют атрибут [[Configurable]], что означает невозможность удалить переменную с помощью оператора delete.

Тем не менее, существует один контекст выполнения, который не подпадает под это правило. Это контекст eval: в нем атрибут [[Configurable]] не устанавливается для переменных.

0

Оператор 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.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь