对你的两个问题的真正简短的回答是,当你使一个变量等于另一个变量时,第一个变量中的内容被复制并存储在第二个变量中- 这两个变量之间没有链接。
但是,请继续阅读以了解更多详细信息以及为什么在某些情况下似乎存在链接...
与许多语言一样,JavaScript 将数据分为两大类:值类型和引用类型。JavaScript 值类型是它的原语:
当您将这些类型中的任何一种分配给变量时,实际数据将存储在该变量中,如果您将一个变量设置为与另一个相同,则会制作原语的副本(而不是链接)并将其存储在新变量中:
var a = 10; // Store the actual number 10 in the a variable
var b = a; // Store a COPY of the actual number stored in a (10) in the b variable
a = 50; // Change the actual data stored in a to 50 (no change to b here)
console.log(b); // 10
当您使用引用类型时,会发生一些不同的事情。将变量分配给引用类型意味着该变量只保存对实际存储对象的内存位置的引用,而不是实际对象本身。所以,当你这样做时:
var a = {foo:"bar"};
a
实际上并不存储对象本身,它只存储可以找到对象的内存位置(即 0x3C41A)。
但是,就设置另一个变量等于第一个变量而言,它仍然像处理原语一样工作——制作第一个变量中的内容的副本并将其提供给第二个变量。
下面是一个例子:
// An object is instantiated in memory and a is given the address of it (for example 0x3C41A)
var a = {};
// The contents of a (the memory location of an object) is COPIED into b.
// Now, both a and b hold the same memory location of the object (0x3C41A)
var b = a;
// Regardless of whether a or b is used, the same underlying object
// will be affected:
a.foo = "test";
console.log(b.foo); // "test"
// If one of the variables takes on a new value, it won't change
// what the other variable holds:
a = "something else";
console.log(b); // The object stored in memory location (0x3C41A)
因此,在您的第一个测试中,您只有两种访问一个对象的方法,然后您将a
保存的内容(对象的内存位置)更改为不同的对象,因此现在您只剩下一种方法来访问原始对象对象,通过b
。
如果我们尝试a
通过设置“清除” a = {}
,对象b
将保持不变。我不明白为什么以这种方式操作对象会产生与第一个示例不同的结果。
因为现在我们知道这a = {}
不是清除对象。它只是指向a
别的东西。