首页 > 解决方案 > 删除未定义的属性和由 const 声明的属性有什么区别,让在 Javascript 中使用 delete 运算符?

问题描述

请看代码,

foo = 1;
delete foo; // true
Object.getOwnPropertyDescriptor(this,'foo').configurable // true
var bar = 2;
delete bar; // false
Object.getOwnPropertyDescriptor(this,'bar').configurable // false
const fooBar = 3;
Object.getOwnPropertyDescriptor(this,'fooBar').configurable // undefined
delete fooBar; //false
Object.getOwnPropertyDescriptor(this,'noexist').configurable // undefined
delete noexist; // true

基于MDN,delete 操作符只能与它们自己的描述符可配置的属性一起使用true,那么为什么 delete “fooBar” 和 “noexist” 返回值之间存在差异?

标签: javascriptdescriptorconfigurable

解决方案


const使用或未let分配给全局对象的变量,因此您的

const fooBar = 3;

当你这样做时没有出现

Object.getOwnPropertyDescriptor(this,'fooBar').configurable

只有使用声明的变量var(或根本没有声明,只分配给,例如 with foo)被分配给全局对象。

delete返回

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

window.foo, 没有用 , 或 , 声明varlet一个const配置的属性。window.bar,用你的 , 声明的var bar,被分配给window一个不可配置的属性。

delete fooBar返回,false因为fooBar尽管实际上不是 on 的属性,但它window是一个无法删除的独立标识符 -delete将导致false无论何时使用delete这样的方法都会在严格模式下引发错误:

'use strict';
const someVar = true;
delete someVar;

但是noexist不是代码中的标识符,因此甚至没有尝试执行的操作,因此它返回true(并且在严格模式下不会引发错误)。


推荐阅读