函数中对象属性指向新对象未生效的原因咨询
为啥给对象属性重新赋值新对象不生效?
先拿你场景的代码举个例子,一看就明白:
let obj = { prop: {} }; function modifyProp(target) { // 这个操作能正常生效 target.prop.name = "小明"; // 这个操作就没效果,原obj的prop还是原来的空对象+name属性 target.prop = { age: 20 }; } modifyProp(obj); console.log(obj.prop); // 输出 { name: "小明" },不是新对象
核心问题出在JavaScript的参数传递规则上——很多人误以为是“按引用传递”,但其实是按值传递,只不过引用类型的值是“引用的副本”。
我给你打个比方:
- 你手里有一把钥匙,对应着一个空房间(就是
obj.prop初始的空对象) - 你把这把钥匙复制了一把,交给函数(函数里的
target就是这个复制的钥匙) - 用复制的钥匙打开房间,在里面放了个名牌(
target.prop.name = "小明"),那原房间里自然会有这个名牌,因为两把钥匙开的是同一个房间 - 但如果你拿着复制的钥匙说:“我现在这把钥匙要开隔壁新装修的房间”(
target.prop = { age:20 })——这时候你只是改了复制钥匙的指向,你手里原来的钥匙,对应的还是原来那个有名牌的房间,完全不受影响
所以你忽略的关键点是:
- 函数里的
target是原对象obj的引用副本,不是原对象本身 - 修改
target.prop的内部属性:是通过副本引用找到原prop对象操作,所以原对象会同步变化 - 直接给
target.prop赋值新对象:只是把副本里的prop指向了新对象,和原对象的prop没有任何关系了,原对象的prop还是保持原来的引用
如果想要让prop指向新对象生效,你有两个简单办法:
- 直接在函数里返回新的
prop,然后外部重新赋值:
function modifyProp(target) { target.prop.name = "小明"; return { age: 20 }; } obj.prop = modifyProp(obj); console.log(obj.prop); // 输出 { age:20 }
- 或者直接修改原对象的
prop(如果函数能访问到原对象的话):
function modifyProp() { obj.prop.name = "小明"; obj.prop = { age:20 }; } modifyProp(); console.log(obj.prop); // 输出 { age:20 }
内容的提问来源于stack exchange,提问作者800c25d6-cd74-11ed-afa1-0242ac
相关产品推荐
相关产品推荐

