【问题标题】:Do arguments based on object property values not hold a reference?基于对象属性值的参数是否不包含引用?
【发布时间】:2018-02-07 16:33:24
【问题描述】:

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

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 没有持有对原始 obj 的引用。

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

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

【问题讨论】:

  • 使nestedObj 指向不同的对象不会影响它曾经指向的对象。
  • 我不相信,这个问题与内存中的引用有关
  • 不存在未定义的隐式返回吗?我的意思是该功能有效,这不是我的问题是关于 0.0
  • 这个变量很好地保存了引用。当你重写一个引用时,你重写了引用,而不是它指向的对象。顺便说一句:for(const sub of path) object = object[sub];

标签: javascript


【解决方案1】:

这是因为当你设置一个对象的引用时,指向那个对象的指针是通过的,但是当你设置一个变量的引用时,它会创建一个新的。

让我解释一下,在你函数的第一次迭代中,你会将对象复制到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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-02
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多