请教: 这段代码为何与预期不一致?

m0_62991537 2024-01-10 18:57:02
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的对象应该只会出现一次才对,结果这里会重复出现一次,是哪里的问题?谢谢

...全文
1755 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
m0_49241056 2024-01-11
精选
  • 打赏
  • 举报
回复 1

这里的问题是出现在 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;
    }
}


m0_62991537 2024-01-11
  • 举报
回复
@m0_49241056 还不是非常理解你的文字描述,但知道出问题的地方了,把sort去掉也会正常的 我的理解就是Object.create把数组转成对象了,不适宜用sort方法,虽然js没报错,但产生了不可预料的结果 现在改用structuredClone方法,数组原样copy过来了,符合预期,还需要时间消化你说的原理,非常感谢
weixin8889 2024-01-10
  • 打赏
  • 举报
回复

111111

87,996

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧