为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript:为什么“for in”循环从__proto__中选择变量?

JavaScript:为什么“for in”循环从__proto__中选择变量?

桃花长相依 2019-04-25 18:15:54
我trigger在Object的原型中添加了一个方法:Object.prototype.trigger = function() {     //  ...     return this;};然后有一个“for in”循环:var obj = { 4: 15, 10 : 41, 11 : 46, 12 : 51, 20 : 74 }for( item in obj ) {     foo( obj[item] );}但是这个循环有6次迭代而不是5次。最后一次迭代是用键:item = "trigger"为什么循环遍历__proto__对象的一部分?
查看完整描述

4 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

for..in迭代原型链上任何位置的所有可枚举属性。如果你想使它trigger不可枚举,所以它不会被迭代for..in,Object.defineProperty而是使用,这使得默认情况下定义的属性不可枚举:


Object.defineProperty(Object.prototype, 'trigger', { value:  function() {

    

}});

var obj = { 4: 15, 10 : 41 }

for( item in obj ) {

    console.log(item);

}


查看完整回答
1 反对 回复 2019-05-17
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

for...in 遍历所有对象属性而不区分对象本身或其任何祖先的属性。


为了仅查看对象本身定义的属性,您可以使用Object.prototype.hasOwnProperty:


const obj = { 4: 15, 10 : 41, 11 : 46, 12 : 51, 20 : 74 }

for( item in obj ) {

  if(obj.hasOwnProperty(item) {

    foo( obj[item] );

  }

}


// will ignore the trigger func and everything else defined on any prototype


查看完整回答
反对 回复 2019-05-17
?
撒科打诨

TA贡献1934条经验 获得超2个赞

另一种方法是使用Object.keys:


Object.prototype.trigger = function() {

    return this;

};


var obj = { 4: 15, 10 : 41, 11 : 46, 12 : 51, 20 : 74 }


Object.keys(obj).forEach(function(item) {

    console.log( "Key: " + item + ", value: " + obj[item] );

});


查看完整回答
反对 回复 2019-05-17
?
阿晨1998

TA贡献2037条经验 获得超6个赞

这是我不久前遇到的一个错误。因为数组也是对象,你可以迭代到原型,不要for..in用于数组。您的示例特定于导致此问题的对象。相反,使用标准for来迭代对象的项目。这样,您可以为要实现的目标实现更清晰,更安全的实现,而不是使用主要用于实现反射的defineProperty或hasOwnProperty。

for (var i = 0; i < Object.values(obj).length; i++){
  console.log(i + ': ' + Object.values(obj)[i]);
  //foo( Object.values(obj)[i] );}


查看完整回答
反对 回复 2019-05-17
  • 4 回答
  • 0 关注
  • 725 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信