Javascript 这个JS对象是如何修改的?

Javascript 这个JS对象是如何修改的?,javascript,Javascript,很抱歉标题不够描述性,我很难很好地总结我的问题 我的问题是,下面的代码是如何工作的 var originalPerson = { person: { name: { first: 'John' } } }; function update(path, val) { var pathParts = path.split('.'); var person = originalPerson; var part; while (pathParts.length > 1

很抱歉标题不够描述性,我很难很好地总结我的问题

我的问题是,下面的代码是如何工作的

var originalPerson = {
    person: { name: { first: 'John' } }
};

function update(path, val) {
  var pathParts = path.split('.');

  var person = originalPerson;
  var part;

  while (pathParts.length > 1) {
    part = pathParts.shift();
    person[part] = typeof person[part] === 'object' ? person[part] : {};
    person = person[part];
  }

  person[pathParts[0]] = val;
}    

update('person.name.last', 'Doe');
// originalPerson.name is:
// { name: { first: 'John', last: 'Doe' } }
我想我理解这些部分。在更新中,person被创建为对originalPerson的引用。一旦while循环完成,原始的person似乎没有改变,person是{first:'John'}

但是,在person[pathParts[0]]=val;之后;,originalPerson已更新,现在包含上次传入函数的新属性

让我困惑的是,为什么当引用被删除时,originalPerson没有被更新。这是我期待的行为:

var person = { name: { first: 'John', last: 'Doe' } }
var jane = person;

jane.name.first = 'Jane';
在本例中,第三行后面的jane.name.first和person.name.first都设置为“jane”

为什么第一个示例中的行为不同?

第一个示例中的while循环实际上是将person作为一个新的引用,一个对原始对象子部分的引用

因此,在第一个循环的最后一行,person=person[part],part=='person'实际上将person作为对originalPerson.person的引用

循环的第二次运行:part=name,person=originalObject.person.name

pathParts现在只剩下最后一个部分。所以在更新的最后一行,person.last='Doe'。此时person是对originalPerson.name的引用,originalPerson会相应地更新

理解这段代码的秘密在于person=person[part]更新对originalPerson的子对象的引用,然后对该子对象进行操作