删除一个未定义的属性和一个由const声明的属性有什么区别,让我们在Javascript中使用delete操作符?
请看代码删除一个未定义的属性和一个由const声明的属性有什么区别,让我们在Javascript中使用delete操作符?,javascript,descriptor,configurable,Javascript,Descriptor,Configurable,请看代码 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(t
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
基于此,delete运算符只能处理其自己的描述符可配置为
true
的属性,那么为什么delete“fooBar”和“noexist”返回值之间存在差异呢?我的理解是,存在一个用const
声明的变量,但未设置属性configurable
,这就是delete
失败的原因(因此返回false
)-变量仍然存在
显然,删除不存在的变量不是无效的操作,操作的目标是删除该变量,由于该变量不存在,操作没有进行,但达到了预期的效果(这就是为什么返回
true
).使用const
或声明的变量不指定给全局对象,因此
const fooBar = 3;
当你这样做时不会出现
Object.getOwnPropertyDescriptor(this,'fooBar').configurable
只有使用var
声明的变量(或者从未声明,仅分配给,例如使用foo
)才能分配给全局对象
删除
将:
对于所有情况均为true,但当属性为自己的不可配置属性时除外,在这种情况下,将在非严格模式下返回false
window.foo
,未使用var
、let
或const
声明,是一个可配置属性<代码>窗口。用var bar
声明的bar
作为不可配置属性分配给窗口
delete fooBar
返回false
,因为fooBar
虽然不是window
上的一个属性,但却是一个无法删除的独立标识符-delete
在使用delete
时会导致false
,这会在严格模式下引发错误:
“严格使用”;
const someVar=true;
删除someVar代码>您不能删除MDN上所述的常数
使用let或const声明的任何属性都不能从定义它们的范围中删除
因此,当您删除常量fooBar
时,它返回一个false。如果无法删除某些内容,则delete语句将返回false。例如,如果您试图删除一个var,如var x=20;删除x//返回false
,则会得到一个false值,因为var不能在其范围内删除。同样,const和let变量不能在其作用域内删除,它们也会返回false
因此,我会这样想:如果某个东西在存在时不能被删除,那么delete语句将返回一个假值
另外,若您试图删除一个不存在的属性,那个么delete语句将返回MDN上所述的true
如果您试图删除的属性不存在,delete将不起任何作用,并返回true
因此,当您删除此
对象上的noexist
属性时,它将返回一个true。附加到中的优秀答案。当您为未声明的变量(如foo=1
)赋值时,会发生以下情况:
Object.defineProperty(窗口'foo',{configurable:true,value:1});
console.log(删除foo);
console.log(window.foo)//从窗口删除