考虑:
A = {};
A.test = 123;
B = A;
C = {};
for (key in A) C[key] = A[key]; // a crude clone.
在这个例子中,B 是对 A 的引用,C 是 A 的深拷贝。
我知道我可以通过A === B
和A === C
但是如果我没有 a A
,我可以在不知道 "A" 的情况下区分 "B" 和 "C" 吗?
考虑:
A = {};
A.test = 123;
B = A;
C = {};
for (key in A) C[key] = A[key]; // a crude clone.
在这个例子中,B 是对 A 的引用,C 是 A 的深拷贝。
我知道我可以通过A === B
和A === C
但是如果我没有 a A
,我可以在不知道 "A" 的情况下区分 "B" 和 "C" 吗?
Javascript 中没有“真实对象”之类的东西。A也是一个参考。
如果您检查B === C
,您将能够发现它们是独立的对象,但您将无法分辨哪个是“原始对象”。
javascript 中的变量永远不是对象,而是包含对对象的引用。您可以将 javascript 视为包含一堆对象,将该对象分配给变量只是将引用放入变量中。因此,保存对对象的引用的第一个变量与您分配给它的最后一个变量之间没有区别。
var x = {a: 1};
var y = x;
y.b = 2;
y
在这一点上和之间没有区别x
——它们都包含对同一个对象的引用。
如果你像你一样制作一个粗略的克隆,那么它是一个完全不同的对象,与原始对象没有进一步的联系。对克隆的更改不会影响原始版本。