Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript对象文字赋值和引用是如何工作的?_Javascript_Object_Object Literal - Fatal编程技术网

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这很有帮助。谢谢!!