Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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
Chrome';s V8 Javascript引擎句柄删除运算符是否正确?_Javascript_Google Chrome - Fatal编程技术网

Chrome';s V8 Javascript引擎句柄删除运算符是否正确?

Chrome';s V8 Javascript引擎句柄删除运算符是否正确?,javascript,google-chrome,Javascript,Google Chrome,函数MyObject(){ this.propA='hello'; } alert(MyObject instanceof Object)//true,所有JavaScript对象(日期、数组、RegExp、函数等)都从Object.prototype继承。 警报({}.name);//未定义的空对象(或object.prototype)没有名称 警报({}.propA)//未定义的空对象没有propA 警报(删除MyObject.propA)//true,函数对象的propA是可删除的。 警报

函数MyObject(){
this.propA='hello';
}
alert(MyObject instanceof Object)//true,所有JavaScript对象(日期、数组、RegExp、函数等)都从Object.prototype继承。
警报({}.name);//未定义的空对象(或object.prototype)没有名称
警报({}.propA)//未定义的空对象没有propA
警报(删除MyObject.propA)//true,函数对象的propA是可删除的。
警报(MyObject.propA);//未定义。
警报(删除MyObject.name)//true,函数对象的名称是可删除的。
警报(MyObject.name)//chrome中的空字符串
Chrome的V8 Javascript引擎是否正确处理delete操作符

您正在从
MyObject
中删除
name
属性。但是
MyObject
的原型(对象
函数.prototype
所指)也有
名称
属性,因为(主要是历史原因)
函数。原型是一个函数。这就是您在
删除
后看到的
MyObject.name
:从其原型中找到的
name
(因为当您在对象上查找属性时,如果它没有该属性,JavaScript引擎将查找其原型,然后再查找其原型等,以尝试找到它)

如果在最后几行中添加
hasOwnProperty
检查,您可以看到发生了什么:

函数MyObject(){
这是propA='hello';
} 
log(MyObject instanceof Object)//true,所有JavaScript对象(日期、数组、RegExp、函数等)都从Object.prototype继承。
console.log({}.name);//未定义的空对象(或object.prototype)没有名称
console.log({}.propA)//未定义的空对象没有propA
日志(删除MyObject.propA)//true,函数对象的propA是可删除的。
console.log(MyObject.propA);//未定义。
console.log(“自身检查1:+MyObject.hasOwnProperty(“名称”);//没错,它有自己的财产
log(删除MyObject.name)//true,函数对象的名称是可删除的。
console.log(“自身检查2:+MyObject.hasOwnProperty(“名称”);//错,现在它来自原型
日志(MyObject.name)//chrome中的空字符串
。作为控制台包装器{
最大高度:100%!重要;
}
Chrome的V8 Javascript引擎是否正确处理delete操作符

您正在从
MyObject
中删除
name
属性。但是
MyObject
的原型(对象
函数.prototype
所指)也有
名称
属性,因为(主要是历史原因)
函数。原型是一个函数。这就是您在
删除
后看到的
MyObject.name
:从其原型中找到的
name
(因为当您在对象上查找属性时,如果它没有该属性,JavaScript引擎将查找其原型,然后再查找其原型等,以尝试找到它)

如果在最后几行中添加
hasOwnProperty
检查,您可以看到发生了什么:

函数MyObject(){
这是propA='hello';
} 
log(MyObject instanceof Object)//true,所有JavaScript对象(日期、数组、RegExp、函数等)都从Object.prototype继承。
console.log({}.name);//未定义的空对象(或object.prototype)没有名称
console.log({}.propA)//未定义的空对象没有propA
日志(删除MyObject.propA)//true,函数对象的propA是可删除的。
console.log(MyObject.propA);//未定义。
console.log(“自身检查1:+MyObject.hasOwnProperty(“名称”);//没错,它有自己的财产
log(删除MyObject.name)//true,函数对象的名称是可删除的。
console.log(“自身检查2:+MyObject.hasOwnProperty(“名称”);//错,现在它来自原型
日志(MyObject.name)//chrome中的空字符串
。作为控制台包装器{
最大高度:100%!重要;

}
谢谢T.J.我不知道当属性不存在时delete会返回true(真奇怪!),IE11也不支持name属性。我没有用“new”来创建一个对象的原因是我想检查函数和对象之间的关系,我想如果我用new创建一个对象,那么它不是函数而是一个对象。但是,是的,这样我没有将自定义属性设置为函数(我想我这样做是因为删除它会返回true,这愚弄了我)谢谢t.J。我不知道当属性不存在时,delete会返回true(这很奇怪!),IE11不支持name属性。我没有用“new”来创建一个对象的原因是我想检查函数和对象之间的关系,我想如果我用new创建一个对象,那么它不是函数而是一个对象。但是,是的,这样我就没有将自定义属性设置为function(我想我是这样做的,因为删除它会返回true,这愚弄了我)