Javascript 为什么删除全局变量和删除var会导致节点中的不同输出?

Javascript 为什么删除全局变量和删除var会导致节点中的不同输出?,javascript,node.js,Javascript,Node.js,我进入终端中的节点,创建了一个全局用户,其global.user={admin:false}。我还创建了一个帐户var account={balance:1000}。 然后我打字 delete user => true delete account => false 为什么删除全局创建的东西会返回true,而删除使用var创建的东西,从我的理解来看,这也是全局返回false 提到: 无法从全局范围中删除使用var声明的任何属性 或者从函数的作用域 如果删除失败,操作返回false

我进入终端中的节点,创建了一个全局用户,其global.user={admin:false}。我还创建了一个帐户var account={balance:1000}。 然后我打字

delete user
=> true

delete account
=> false
为什么删除全局创建的东西会返回true,而删除使用var创建的东西,从我的理解来看,这也是全局返回false

提到:

无法从全局范围中删除使用var声明的任何属性 或者从函数的作用域

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

提到:

无法从全局范围中删除使用var声明的任何属性 或者从函数的作用域

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

对于所有情况,delete的返回值都为true,但 属性是自己的不可配置属性,在这种情况下,false为 以非严格模式返回

delete操作符从对象中删除给定的属性。在…上 删除成功,返回true,否则返回false

使用var声明的任何属性都不能从全局范围或函数范围中删除,因此返回false

检查是否删除

对于所有情况,delete的返回值都为true,但 属性是自己的不可配置属性,在这种情况下,false为 以非严格模式返回

delete操作符从对象中删除给定的属性。在…上 删除成功,返回true,否则返回false

使用var声明的任何属性都不能从全局范围或函数范围中删除,因此返回false

首先,删除用于删除对象的属性,而不是删除变量。来自MDN:

JavaScript delete操作符从对象中删除属性

在严格的模式下:

var x = "hello";
delete x;
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为在全局范围内预定义的预先存在的全局对象指定属性。全局对象的属性与对象的任何其他可配置属性一样,可以通过删除来删除

delete运算符返回的true或false值告诉您删除是否成功。

首先,delete用于删除对象的属性,而不是删除变量。来自MDN:

JavaScript delete操作符从对象中删除属性

在严格的模式下:

var x = "hello";
delete x;
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为在全局范围内预定义的预先存在的全局对象指定属性。全局对象的属性与对象的任何其他可配置属性一样,可以通过删除来删除


delete运算符返回的true或false值告诉您删除是否成功。

您删除的不是account的对象属性。但对于用户,它转到全局对象并从中删除用户密钥。因此,如果您尝试删除未定义的变量,它将显示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
> 

您正在删除的不是帐户的对象属性。但对于用户,它转到全局对象并从中删除用户密钥。因此,如果您尝试删除未定义的变量,它将显示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
> 

在我的案例中,这两个都返回真我添加了一个图像,这样你就知道我没有犯错误创建为global这两个都返回真我添加了一个图像,这样你就知道我没有犯错误创建为global这两个都是global,那么loc之间的区别是什么
变量和该上下文中对象的属性?如果在模块函数中定义任何内容,那么如何可能拥有全局对象的属性?@Dog-var account在当前范围中创建一个局部变量。global.user=xxx为全局范围中预定义的全局对象指定属性。这些是非常不同的事情。“删除”可用于从全局对象中删除属性。它不能用于从本地范围中删除内容,因为这不是Javascript支持的功能。@jfriend00,当您在单个文件nodejs程序中执行var user=test时。您可以执行console.logglobal.test,它将为您提供测试。但当您删除global.test时,它将返回false。这意味着您无法使用上面评论中提到的“删除全局”删除所有属性。发生这种情况的原因在我对这个问题的回答^@Atul中提到-我觉得您回答的中间部分是错误的。而且,当我在单个文件node.js程序中执行var user=test时,console.logglobal.test会给出未定义的值,而不是test的值。var user=test为我生成一个局部变量,而不是全局变量。而且,如果您查看node.js调试器中的单个文件,您可以看到它被封装在一个模块函数中,这解释了为什么var test生成局部变量,而不是全局变量。但是,在该上下文中,局部变量和对象属性之间有什么区别?如果在模块函数中定义任何内容,那么如何可能拥有全局对象的属性?@Dog-var account在当前范围中创建一个局部变量。global.user=xxx为全局范围中预定义的全局对象指定属性。这些是非常不同的事情。“删除”可用于从全局对象中删除属性。它不能用于从本地范围中删除内容,因为这不是Javascript支持的功能。@jfriend00,当您在单个文件nodejs程序中执行var user=test时。您可以执行console.logglobal.test,它将为您提供测试。但当您删除global.test时,它将返回false。这意味着您无法使用上面评论中提到的“删除全局”删除所有属性。发生这种情况的原因在我对这个问题的回答^@Atul中提到-我觉得您回答的中间部分是错误的。而且,当我在单个文件node.js程序中执行var user=test时,console.logglobal.test会给出未定义的值,而不是test的值。var user=test为我生成一个局部变量,而不是全局变量。而且,如果您查看node.js调试器中的单个文件,您可以看到它被封装在一个模块函数中,这解释了为什么var test生成局部变量,而不是全局变量。