Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.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
Javascript 意外';删除';返回值_Javascript - Fatal编程技术网

Javascript 意外';删除';返回值

Javascript 意外';删除';返回值,javascript,Javascript,我有以下代码段,其中最后一次“delete”用法返回了一个意外值 函数形状(){ 这个a=10; } 形状.原型.a=20; var s=新形状(); console.log(s.a);//10 删除s.a//真的 console.log(s.a)//20 删除s.a//真的 console.log(s.a);//20delete关键字的返回值不表示删除操作是否确实删除了字段。从: 返回值 如果属性是自己的不可配置属性,则以严格模式抛出 属性(在非严格表达式中返回false)。在所有其他情况下

我有以下代码段,其中最后一次“delete”用法返回了一个意外值

函数形状(){
这个a=10;
}
形状.原型.a=20;
var s=新形状();
console.log(s.a);//10
删除s.a//真的
console.log(s.a)//20
删除s.a//真的

console.log(s.a);//20
delete关键字的返回值不表示删除操作是否确实删除了字段。从:

返回值

如果属性是自己的不可配置属性,则以严格模式抛出 属性(在非严格表达式中返回false)。在所有其他情况下返回true 案例

在您的情况下,
s.a
不是自己的属性,因此
delete
将始终返回
true
。属性是否在原型链中找到并不重要。例如:

delete {}.xyz; // also returns `true`.
您不应该改变原型,因为它会破坏JavaScript引擎为提高性能所做的所有优化。但是,如果确实需要,可以使用此功能:

function deepDelete(o,key) {
  while (o) {
    delete o[key];
    o = Object.getPrototypeOf(o);
  }
}
例如:

function S(){}
S.prototype.a = 8;
var s = new S();
s.a = 9;
console.log(s.a); // 9
delete s.a;
console.log(s.a); // 8
deepDelete(s, 'a');
console.log(s.a); // undefined
函数形状(){
//这个a=10;
}
形状.原型.a=20;
var s=新形状();
控制台日志(s.a);
删除Shape.prototype.a;

控制台日志(s.a)“delete”方法只能删除对象的自身属性,而不能删除原型的属性。当删除对象中不存在的属性时,它将返回true;但是,以下情况将返回false:

删除Object.prototype//renturn错误;属性无法设置
var x=1;
删除此.x//回剥;无法删除全局变量
函数f(){}

删除本条//返回false;无法删除全局函数
什么意思
delete
返回
true
delete
是一条语句,不是表达式。您可以在控制台中检查“delete”的返回值。如果项目被删除,则在对语句求值后返回“true”。请在对问题进行向下表决之前检查“delete”用法。很抱歉我错了
delete
是运算符而不是语句。PS:为什么你认为是我否决了这个问题?可能是任何人。PPS:不是我否决了这个问题。我想知道
deepDelete
对主机对象(比如旧IE中的DOM元素)有什么作用?;-)@JanDvorak嗯,老实说,我不知道(谁知道?:)我最好的猜测是它会使代码崩溃。可以是空指针异常,也可以是奇怪的不可修补的。您还可以使用“in”运算符、hasOwnProperty()或propertyIsEnumerable()来测试属性是否属于对象。还有一个简单的方法:o.x==未定义;