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的子对象的引用,然后对该子对象进行操作