我进入终端的Node并使用global.user = {admin:false}创建了一个全局用户。我还创建了一个帐户var account = {balance:1000}。 然后我输入
delete user
=> true
delete account
=> false
为什么删除全局创建的内容会返回true,但删除使用var创建的内容(从我的理解中也是全局的)会返回false?
答案 0 :(得分:2)
首先,delete
用于删除对象的属性,而不是用于删除变量。来自MDN:
JavaScript delete运算符从对象中删除属性
并且,在严格模式下:
var,let和const创建无法使用delete运算符删除的不可配置属性。在严格模式下,这将引发SyntaxError。
如果你只是在严格模式下在node.js中尝试这个:
var x = "hello";
delete x;
你会得到:
SyntaxError: Delete of an unqualified identifier in strict mode.
在非严格模式下,delete
将返回false
并且不执行任何操作,并且不会抛出异常(出于向后兼容性原因)。
在node.js中,所有代码都在模块函数中,因此您使用var
声明的任何内容都不是全局的。它是模块函数中的局部变量,函数内声明的局部变量不能用delete
删除,因为这不是Javascript支持的功能。这是var
的作用 - 它在当前作用域中创建了一个局部变量。
global.user = xxx
将一个属性分配给在全局范围内预定义的预先存在的global
对象。可以使用global
删除delete
对象的属性(与对象的任何其他可配置属性一样)。
true
运算符的false
或delete
返回值会告诉您delete
是否成功。
答案 1 :(得分:1)
答案 2 :(得分:1)
删除的返回值对于所有情况都是true,除非 property是一个自己的不可配置属性,在这种情况下,false是 以非严格模式返回。
另外
delete运算符从对象中删除给定属性。上 成功删除后,它将返回true,否则返回false。
使用var
声明的任何属性都无法从全局范围或函数范围中删除,因此会返回false
检查删除 MDN documentation
答案 3 :(得分:1)
您正在删除account
的对象属性。但是对于用户的情况,它转到global
对象并从中删除user
密钥。因此,如果您尝试删除未定义的变量,则显示为true。
> global.user = {1:2}
{ '1': 2 }
> delete user
true
> delete nice
true
> var account = {3: 4}
undefined
> delete account
false
> account
{ '3': 4 }
> global.user
undefined
> delete account['3']
true
> delete user
true
> nice = undefined
undefined
> delete nice
true
>