我遇到了这个问题,因为我正在构建一个递归函数来钻取对象。给定一个对象和路径(作为字符串数组):
const path = ['path', 'to', 'nestedObj', 'someProp'];
const obj = {
path: {
to: {
nestedObj: {
someProp: 'someValue'
}
}
}
}
我提出了这个解决方案:
function setValueFromPath(object, path, value) {
let nestedObj = object[path[0]];
const nextPath = path.slice(1, path.length);
if(path.length > 1) {
return setValueFromPath(nestedObj, nextPath, value);
}
nestedObj = value;
}
然而,并没有将价值重新分配给某些道具。对我来说,这意味着最后一行,nestedObj = value
,nestedObj
没有对原始对象的引用。
所以我做了一些摆弄并尝试了这个:
function setValueFromPath(object, path, value) {
let nestedObj = object[path[0]];
const nextPath = path.slice(1, path.length);
if(path.length > 2) {
return setValueFromPath(nestedObj, nextPath, value);
}
nestedObj[path[1]] = value;
}
在这种情况下,这会改变原始对象(预期行为)。我的问题:为什么这个nestedObj
似乎是对原始对象的引用,而不是第一个解决方案中的第一个引用?我不认为它与递归函数有任何关系。但是我有点困惑,并且想知道是否有人可以解释一下。
答案 0 :(得分:0)
这是因为当您设置对象的引用时,会传递指向该对象的指针,但是当您设置对变量的引用时,它将创建一个新对象。
让我解释一下自己,在函数的第一次迭代中,您将对象复制到nestedObj
let nestedObj = object[path[0]]; // so nestedObj points to path, which is an object
但是在最后一次迭代中,你只需将someProp的值复制到nestedObj(因为它不是一个对象,它将在内存中创建一个新位置来存储它,因此只更改该变量的实例)
let nestedObj = object[path[0]]; // Here nested obj is a copy of someProp