Javascript对象文字赋值和引用是如何工作的?
我有一个简单的问题Javascript对象文字赋值和引用是如何工作的?,javascript,object,object-literal,Javascript,Object,Object Literal,我有一个简单的问题 let obj1 = {}; obj2= obj1;` 此处,obj1和obj2引用内存中的同一对象,即obj1===obj2-->true。因此,根据该逻辑,obj2上的任何操作都将影响obj1 现在,如果我将一个属性指定给obj2 让obj1={}; obj2=obj1; obj2['a']={}; obj2=obj2['a'];//如果它们引用同一对象,为什么此操作没有更改obj1? console.log(obj1);//-->{a:{}}; console.lo
let obj1 = {};
obj2= obj1;`
此处,obj1和obj2引用内存中的同一对象,即obj1===obj2-->true
。因此,根据该逻辑,obj2上的任何操作都将影响obj1
现在,如果我将一个属性指定给obj2
让obj1={};
obj2=obj1;
obj2['a']={};
obj2=obj2['a'];//如果它们引用同一对象,为什么此操作没有更改obj1?
console.log(obj1);//-->{a:{}};
console.log(obj2);//-->{};代码>obj2是一个对象,obj2[a]是另一个对象。比较两个对象的结果是错误的
{} === {} // false
obj2是一个对象,obj2[a]是另一个对象。比较两个对象的结果是错误的
{} === {} // false
对于对象,赋值操作符=
为对象指定一个引用
因此:
let obj1 = {};
let obj2 = obj1;
obj1和obj2都引用同一对象。现在:
obj2['a'] = {};
创建新特性a并为其指定一个值,该值是对新对象的引用。由于obj1和obj2都引用同一对象,因此您还将发现:
obj2.a === obj1.a
但是:
obj2 = obj2['a']; // why this operation didn't change obj1, if they are referencing the same object ?
您现在已将不同的对象指定给obj2,因此它现在引用最初指定给obj2.a
的新对象,并且:
obj1.a === obj2;
因此修改了obj1(或者更准确地说,修改了obj1引用的对象)
一些代码:
//obj1和obj2引用同一对象
设obj1={};
设obj2=obj1;
console.log('obj2==obj1'+(obj2==obj1));//真的
//将新对象指定给obj2.a
obj2['a']={};
//影响obj1
console.log('obj2.a==obj1.a'+(obj2.a==obj1.a));//真的
//将新对象指定给obj2
obj2=obj2['a'];
//obj2现在将另一个对象引用到obj1
console.log('obj1==obj2'+(obj1==obj2));//假的
//obj1.a仍然引用新对象
console.log('obj1.a==obj2'+(obj1.a==obj2));//true
对于对象,赋值运算符=
为对象指定一个引用
因此:
let obj1 = {};
let obj2 = obj1;
obj1和obj2都引用同一对象。现在:
obj2['a'] = {};
创建新特性a并为其指定一个值,该值是对新对象的引用。由于obj1和obj2都引用同一对象,因此您还将发现:
obj2.a === obj1.a
但是:
obj2 = obj2['a']; // why this operation didn't change obj1, if they are referencing the same object ?
您现在已将不同的对象指定给obj2,因此它现在引用最初指定给obj2.a
的新对象,并且:
obj1.a === obj2;
因此修改了obj1(或者更准确地说,修改了obj1引用的对象)
一些代码:
//obj1和obj2引用同一对象
设obj1={};
设obj2=obj1;
console.log('obj2==obj1'+(obj2==obj1));//真的
//将新对象指定给obj2.a
obj2['a']={};
//影响obj1
console.log('obj2.a==obj1.a'+(obj2.a==obj1.a));//真的
//将新对象指定给obj2
obj2=obj2['a'];
//obj2现在将另一个对象引用到obj1
console.log('obj1==obj2'+(obj1==obj2));//假的
//obj1.a仍然引用新对象
console.log('obj1.a==obj2'+(obj1.a==obj2));//true
obj2=obj2。a
重新分配obj2
,因此它不再指向obj1
。因为当您执行obj2=obj2[a]
时,您正在将标识符名称obj2
重新分配到一个全新的值,而不仅仅是添加一个属性。@niraj为什么会让您感到困惑?在obj2.a={}之后;obj2=obj2.a代码>,obj1
指向与以前相同的对象<代码>obj2
不存在;它指向由obj1
指向的对象的a
属性<代码>obj1==obj2.a
。然后,如果将属性b
添加到obj2
,只需将另一个属性嵌套在obj2
中即可。由于obj1
仍然指向“根”对象,因此它当然反映了所有的更改。@niraj单步执行可能有助于将某些事情清理干净well@NickParsons这很有帮助。非常感谢obj2=obj2.a
重新分配obj2
,因此它不再指向obj1
。因为当您这样做obj2=obj2[a]
时,您将标识符名称obj2
重新分配到一个全新的值,而不仅仅是添加一个属性。@niraj为什么它会让您感到困惑?在obj2.a={}之后;obj2=obj2.a代码>,obj1
指向与以前相同的对象<代码>obj2
不存在;它指向由obj1
指向的对象的a
属性<代码>obj1==obj2.a。然后,如果将属性b
添加到obj2
,只需将另一个属性嵌套在obj2
中即可。由于obj1
仍然指向“根”对象,因此它当然反映了所有的更改。@niraj单步执行可能有助于将某些事情清理干净well@NickParsons这很有帮助。谢谢!!