JavaScript为对象添加自定义属性时出现无限嵌套问题求助
问题分析与解决:对象添加自身引用导致无限嵌套,存在性判断无效
问题根源
你遇到的无限嵌套问题,核心原因是JavaScript对象是引用类型:当你执行promotion['promotion'] = promotion时,并不是把原对象的“副本”赋值给属性,而是让promotion.promotion直接指向同一个对象。这就意味着,当你访问promotion.promotion时,得到的还是原对象本身,而这个对象又包含了promotion属性,以此类推形成无限嵌套。
至于if (promotion.promotion) continue判断无效,是因为第一次循环时promotion.promotion确实不存在,赋值之后这个属性就指向了对象自身——后续检查时这个属性永远存在,但它本质就是对象自己,所以这个判断根本没法解决问题,因为问题的核心不是重复赋值,而是赋值的内容是对象自身。
解决方案
要实现你期望的“单级引用”,需要为每个对象的promotion属性赋值一个不包含自身引用的原对象副本,而不是对象本身。可以用以下两种方式实现浅拷贝:
方式1:对象展开语法(推荐)
const promotions = [{ title: 'My offer title', subtitle: 'lorem ipsum' }, { title: 'My offer title 2', subtitle: 'lorem ipsum' }, { title: 'My offer title 3', subtitle: 'lorem ipsum' }] for (const [index, promotion] of promotions.entries()) { // 浅拷贝原对象,得到不含promotion属性的副本 const promotionRef = {...promotion}; promotion.promotion = promotionRef; }
方式2:Object.assign
const promotions = [{ title: 'My offer title', subtitle: 'lorem ipsum' }, { title: 'My offer title 2', subtitle: 'lorem ipsum' }, { title: 'My offer title 3', subtitle: 'lorem ipsum' }] for (const [index, promotion] of promotions.entries()) { const promotionRef = Object.assign({}, promotion); promotion.promotion = promotionRef; }
效果验证
修改后的代码会生成你期望的结构:每个对象的promotion属性是原对象的一个独立副本,仅包含title和subtitle,不会出现无限嵌套的情况。
注意:如果原对象包含嵌套的子对象,浅拷贝只会复制子对象的引用。如果需要完全独立的深拷贝,可以使用
JSON.parse(JSON.stringify(promotion))(但该方法无法处理函数、Symbol等特殊类型),你的场景中浅拷贝已经足够。
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

