You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过引用为嵌套对象末级属性赋值?代码执行无预期效果

如何通过引用修改嵌套对象的末级属性?

嗨,我来帮你解决这个问题~你遇到的核心问题是变量赋值和对象引用的区别,咱们一步步拆解:

原代码的问题分析

先看你写的这段代码:

var obj = { level: { level: { level: {} } } };
do {
    var level = obj.level;
} while(Object.keys(level).length != 0);
level = { newPro: 'Some value' }

这里的问题出在最后一行的赋值:

  • 循环结束时,level确实指向了obj最内层的空对象{};
  • 但当你执行level = { newPro: 'Some value' }时,你并没有修改原来的空对象,而是把level变量重新指向了一个全新的对象。原来的obj里的末级空对象还是原样,自然不会有变化。

两种解决方案

方案1:直接修改末级对象的属性(不替换整个对象)

如果只需要给末级对象添加属性,不需要替换整个对象,直接修改level指向的原对象即可:

var obj = { level: { level: { level: {} } } };
var level = obj;
// 遍历到最内层的空对象
while (level.level) {
    level = level.level;
}
// 直接给原对象添加属性
level.newPro = 'Some value';

这样修改后,obj就会变成你期望的结构:{ level: { level: { level: { newPro: 'Some value' } } } }

方案2:替换整个末级对象(需要跟踪父对象)

如果你需要把末级空对象完全替换成新对象,就得在遍历过程中记录父对象,最后修改父对象的level属性:

var obj = { level: { level: { level: {} } } };
var parent = obj;
// 遍历到包含末级空对象的父对象
while (Object.keys(parent.level).length !== 0) {
    parent = parent.level;
}
// 直接替换父对象的level属性
parent.level = { newPro: 'Some value' };

这个方案会直接把原来的末级空对象替换成新对象,同样能得到你想要的结果。

关键知识点

  • 当你把对象赋值给变量时,变量存储的是对象的引用,不是对象本身;
  • 如果修改引用指向的对象的属性,原对象会跟着变化;
  • 但如果给变量重新赋值一个新对象,变量就会和原对象断开引用,原对象不会受到影响。

内容的提问来源于stack exchange,提问作者ADIB Development

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:04:12