Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除一个未定义的属性和一个由const声明的属性有什么区别,让我们在Javascript中使用delete操作符?_Javascript_Descriptor_Configurable - Fatal编程技术网

删除一个未定义的属性和一个由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)//从窗口删除