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

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__对象的一部分?


桃花长相依
浏览 726回答 4
4回答

扬帆大鱼

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);}

一只萌萌小番薯

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

撒科打诨

另一种方法是使用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] );});

阿晨1998

这是我不久前遇到的一个错误。因为数组也是对象,你可以迭代到原型,不要for..in用于数组。您的示例特定于导致此问题的对象。相反,使用标准for来迭代对象的项目。这样,您可以为要实现的目标实现更清晰,更安全的实现,而不是使用主要用于实现反射的defineProperty或hasOwnProperty。for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;Object.values(obj).length;&nbsp;i++){ &nbsp;&nbsp;console.log(i&nbsp;+&nbsp;':&nbsp;'&nbsp;+&nbsp;Object.values(obj)[i]); &nbsp;&nbsp;//foo(&nbsp;Object.values(obj)[i]&nbsp;);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript