为什么在Node中删除全局和删除var导致不同的输出?

时间:2018-01-04 07:05:47

标签: javascript node.js

我进入终端的Node并使用global.user = {admin:false}创建了一个全局用户。我还创建了一个帐户var account = {balance:1000}。 然后我输入

delete user
=> true

delete account
=> false

为什么删除全局创建的内容会返回true,但删除使用var创建的内容(从我的理解中也是全局的)会返回false?

enter image description here

4 个答案:

答案 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运算符的falsedelete返回值会告诉您delete是否成功。

答案 1 :(得分:1)

提及here

  

无法从全局范围中删除使用var声明的任何属性   或者从功能的范围。

如果删除失败,操作将返回false。

答案 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
>