我在对象的原型中添加了一个方法trigger:
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__部分?

发布于 2019-05-16 12:27:34
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);
}
发布于 2019-05-16 12:35:16
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-16 12:34:55
另一种方法是使用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] );
});
https://stackoverflow.com/questions/56168498
复制相似问题