请考虑以下代码段(此处为小提琴):
var a;
a = 1;
console.log(delete a); // prints 'false'
b = 1;
console.log(delete b); // prints 'true'
为什么delete
关键字在全局变量a
和上的行为不同b
?
请考虑以下代码段(此处为小提琴):
var a;
a = 1;
console.log(delete a); // prints 'false'
b = 1;
console.log(delete b); // prints 'true'
为什么delete
关键字在全局变量a
和上的行为不同b
?
删除操作符从对象中删除一个属性。
全局变量(不带var
)是全局对象(通常是window
)的属性,因此可以删除。
Avar
不是全局变量,而是外部范围内的局部变量——不是全局对象的属性——所以delete
不会删除它。从那些文档中:
x = 42; // creates the property x on the global object
var y = 43; // declares a new variable, y
delete x; // returns true (x is a property of the global object and can be deleted)
delete y; // returns false (delete doesn't affect variable names)
MDN 说只有当属性存在并且不能被删除时,delete 才会返回 false。它在所有其他情况下返回 true。删除后,尝试测试实际值。你会看到它a
没有被删除。这是因为,正如 MDN 页面所说,delete
不会影响变量名。
它对变量或函数名称没有影响。
(即,使用全局对象定义var
而不脱离全局对象)
查看下一页上的示例。 https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/delete
不同之处在于声明的变量是全局对象的不可配置属性,而未声明的变量是可配置的。
var a;
--> 这是一个声明的变量,因为你使用的是var
,所以它是不可配置的。
a = 6;
--> 这是一个未声明的变量,因为你没有使用var
,所以它是可配置的。
上面的两种语法都会以一个名为a
attach 的 var 作为全局对象的属性结束(window
通常),并且 properties 具有以下属性:
它是从ecmascript5 对象和属性中提取的,正如您所读到的,所讨论的变量的configurable
属性会影响该变量是否可以被删除。
“var a”表示无法从当前块之外的任何地方访问它,因此删除它意味着UNDECLARE(与未定义不同),从而允许在同一块中再次写入“var a”(错误)。
允许的用法(MDN):
delete object.property
delete object['property']
delete object[index]
delete property
这就像 GOTO 和非结构化编程,您可能需要手动清理资源,它有点像 C 中的 ~Destructor(虽然不一样)。你可以删除一个像 ~a(); 这样的对象。但你不能像“int i”那样“'UNDECLARE'一个变量”。