obj
和copiedObj
是数组,而不是普通对象。更改状态copiedObj
(通过checked
向其添加属性)不会更改状态,obj
因为它们是单独的数组。
但是,两个数组都包含对同一个对象的引用(上面有一个cheecked
)。所以如果你这样做:
checkedObj[0].checked = true;
这会改变那个对象的状态,你会看到你是否在obj[0]
或上查找该对象checkedObj[0]
。
如果要进行深拷贝以便拥有单独的数组和单独的对象,请参阅此问题的答案。
由于我 99% 确定你的意思checkedObj[0].checked = true
,我将解释这段代码中发生的事情:
// Creates an array containing an object
const obj = [{id: 1, checked: true}];
// Creates a new array that contains the *same* object (NOT a *copy* of it)
const copiedObj = [...obj];
// Sets `checked` on that one object that is in both arrays
copiedObj[0].checked = false;
// Looks at the `checked` property on that one object that is in both arrays
console.log(obj[0].checked);
一步步:
后
// Creates an array containing an object
const obj = [{id: 1, checked: true}];
在记忆中你有类似的东西
+−−−−−−−−−−−−−−−+
obj:Ref44329−−−−−>| (数组) |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−+
| 0:Ref82445 |−−−>| (对象) |
+−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−+
| 编号:1 |
| 检查: 真 |
+−−−−−−−−−−−−−−−−−+
然后当你做
// Creates a new array that contains the *same* object (NOT a *copy* of it)
const copiedObj = [...obj];
你有这样的事情:
+−−−−−−−−−−−−−−−+
obj:Ref44329−−−−−−−−−−−>| (数组) |
+−−−−−−−−−−−−−−−+
| 0:Ref82445 |−−+
+−−−−−−−−−−−−−−+ |
|
| +−−−−−−−−−−−−−−−−−−+
+−−>| (对象) |
+−−−−−−−−−−−−−−+ | +−−−−−−−−−−−−−−−−−−+
checkedObj:Ref12987−−−>| (数组) | | | 编号:1 |
+−−−−−−−−−−−−−−+ | | 检查: 真 |
| 0: Ref82445 |−−+ +−−−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−+
然后当你做
// Sets `checked` on that one object that is in both arrays
copiedObj[0].checked = false;
它改变了两个数组指向的对象
+−−−−−−−−−−−−−−−+
obj:Ref44329−−−−−−−−−−−>| (数组) |
+−−−−−−−−−−−−−−−+
| 0:Ref82445 |−−+
+−−−−−−−−−−−−−−+ |
|
| +−−−−−−−−−−−−−−−−−−+
+−−>| (对象) |
+−−−−−−−−−−−−−−+ | +−−−−−−−−−−−−−−−−−−+
已检查对象:Ref12987−−−>| (数组) | | | 编号:1 |
+−−−−−−−−−−−−−−+ | | 检查:假|
| 0:Ref82445 |−−+ +−−−−−−−−−−−−−−−−+
+−−−−−−−−−−−−−−−+
...因此false
无论您通过哪个数组查看它,查找它都会给您。