我想删除所有以“ Nwxp ”开头的全局变量。
因此,我遍历了所有全局变量。
检查开头是否与我的字符串相等,然后删除它们。
但是,delete关键字不会删除我的变量。我究竟做错了什么?
这是我的代码:
var strNwxp = "Nwxp";
for (var variable in global){
var toCheck = variable.substring(0, 4);
if (strNwxp === toCheck) {
delete variable;
}
}
答案 0 :(得分:1)
作为Yeldar Kurmangaliyev points out,您正在删除错误的内容。但是,即使删除正确的内容,也无法删除用var
创建的全局变量。在这种情况下,delete
会产生false
(如果变量是以可以删除的方式创建的,例如true
,则global.foo = 42
)。因此,如果以这种方式创建的全局对象将无法正常工作。
另外,请注意,并非所有全局变量都不再是全局对象的属性,而不是从ES2015开始。具体来说,全局范围内的let
,const
和class
创建的不是全局对象属性的全局变量。 (但是,如果您使用的是Node.js,则可能不在全局范围内使用它们。)
要确保您可以删除全局变量,请不要使用var
,而要对global
上的属性进行赋值:
global.Nwxplaskdflk = 42;
该全局变量可以删除。
一些注意事项:
我假设global
是对代码中全局对象的引用。例如,您正在使用Node.js或类似的环境来创建它,或者您自己的代码中有var global = this;
在全局范围内。
通常,如果可以避免创建全局变量,请避免创建全局变量。 :-)而是在其他对象上使用属性。 (如果由于某种原因引用该对象的变量必须是全局变量,那么它却是全局变量,但全局命名空间非常拥挤,最好避免添加到该变量中。)
答案 1 :(得分:0)
您的代码正在尝试删除名为variable
的属性。
相反,据我了解,您实际上是想从global
中删除一个属性,该属性的名称以字符串形式存储在variable
中。
您需要致电delete global[variable]
来完成此操作:
var strNwxp = "Nwxp";
for (var variable in global)
{
var toCheck = variable.substring(0, 4);
if (strNwxp === toCheck) {
delete global[variable];
}
}
假定Nwxp*
属性直接分配给global
而不是var
。
Another answer描述得更好。
在浏览器环境中,具有global
的演示片段已更改为window
:
window.NwxpHello = "World!";
window.NwxpKey = "value";
window.NotNwxpKey = "another value";
var strNwxp = "Nwxp";
for (var variable in window)
{
var toCheck = variable.substring(0, 4);
if (strNwxp === toCheck) {
delete window[variable];
}
}
console.log(window.NwxpHello); // undefined, starts with "Nwxp" - was removed
console.log(window.NwxpKey); // undefined, starts with "Nwxp" - was removed
console.log(window.NotNwxpKey); // another value