87,996
社区成员
发帖
与我相关
我的任务
分享
window.O = new Array();
window.O[1] = {
"ID": 1,
"VALUE": 1
};
window.O[2] = {
"ID": 2,
"VALUE": 2
};
var list = Object.create(window.O);
list.sort(function(a, b) {
return a.VALUE - b.VALUE;
});
var a = [];
for (var i in list) {
var b = list[i];
if (a[b.ID]) {
console.log("重复:" + b.ID); //为何会来这里?
}
console.log("遍历:" + b.ID);
a[b.ID] = 1;
}
按逻辑,遍历list处,ID为2的对象应该只会出现一次才对,结果这里会重复出现一次,是哪里的问题?谢谢
这里的问题是出现在 Object.create(window.O) 行,它会将原型链中的属性也继承到新创建的对象 list 上。在这个例子里,list 的原型链是 window.O,所以 list 拥有 window.O 的属性。因此,使用 for...in 遍历时,它会遍历 list 的属性以及原型链上的属性,所以 ID 为 2 的对象(在这里是window.O[2])会被遍历到两次。
你可以使用 hasOwnProperty() 方法来解决这个问题,这样就不会遍历原型链属性。
在遍历之前,使用 if (list.hasOwnProperty(i)) 判断属性是否属于 list 对象:
window.O = new Array();
window.O[1] = {
"ID": 1,
"VALUE": 1
};
window.O[2] = {
"ID": 2,
"VALUE": 2
};
var list = Object.create(window.O);
list.sort(function(a, b) {
return a.VALUE - b.VALUE;
});
var a = [];
for (var i in list) {
if (list.hasOwnProperty(i)) {
var b = list[i];
if (a[b.ID]) {
console.log("重复:" + b.ID);
}
console.log("遍历:" + b.ID);
a[b.ID] = 1;
}
}
111111