基于对象属性值的参数不能包含引用吗?

时间:2018-02-07 16:33:25

标签: javascript

我遇到了这个问题,因为我正在构建一个递归函数来钻取对象。给定一个对象和路径(作为字符串数组):

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 = valuenestedObj没有对原始对象的引用。

所以我做了一些摆弄并尝试了这个:

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似乎是对原始对象的引用,而不是第一个解决方案中的第一个引用?我不认为它与递归函数有任何关系。但是我有点困惑,并且想知道是否有人可以解释一下。

1 个答案:

答案 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