delete关键字在全局变量上的不同行为

Different behaviour of delete keyword on global variables

本文关键字:关键字 全局变量 delete      更新时间:2023-09-26

请考虑以下片段(此处为fiddle):

​var a;
​a = 1;
console.log(delete a​); // prints 'false'
​b = 1;
console.log(delete b);​ // prints 'true'​​​​

为什么delete关键字在全局变量ab上表现不同?

来自MDN文档:

delete运算符从对象中删除特性。

全局变量(不带var)是全局对象(通常为window)上的属性,因此可以删除。

var不是全局变量,而是外部作用域中的局部变量-不是全局对象的属性-因此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

来自mozilla文档关于var:

不同之处在于,声明的变量是全局对象的不可配置属性,而未声明的是可配置的

var a;-->这是一个已声明的变量,因为您使用的是var,所以它是不可配置的。

a = 6;-->这是一个未声明的变量,因为您没有使用var,所以它是可配置的。

上面的两个语法最终都会附加一个名为a的var作为全局对象的属性(通常为window),并且属性具有以下属性:

  • 可写。如果为false,则无法更改属性的值
  • 可配置。如果为false,则任何删除属性或更改其属性(可写、可配置或可枚举)的尝试都将失败
  • 可枚举。如果为true,则当用户执行for(obj中的var-prop){}(或类似操作)时,该属性将被迭代

从ecmascript5对象和属性中提取,正如您所读到的,有问题的变量的configurable属性会影响变量是否可以删除。

"var a"意味着不能从当前块之外的任何地方访问它,因此删除它WOULDmeanUNDECLARE(与未定义的不同),从而允许在同一块中再次写入"var a"(错误)。

允许使用(MDN):

delete object.property 
delete object['property'] 
delete object[index] 
delete property

这就像GOTO和非结构化编程,在那里你可能需要手动清理资源,它有点像C中的~Destructor(尽管不一样)。您可以删除对象,如~a();但不能像"int i"那样"UNDECLARE"是一个变量。