var a = 0;
var b = a;
b = 9;
console.log(a); // 0; changing b does not change a.
var c = [1, 2, 3];
var d = c;
d[0] = "hi";
console.log(c); // ["hi", 2, 3]; changing d[0] also changes c[0]! Why?!
我想" ="只将事物分配给变量,但是在数组的情况下,似乎" ="使两个数组直接相互链接。使用" ="使用整数(作为示例)不会产生相同的行为。为什么是这样?这让我重新思考如何为数组创建单独的存储位置。还有其他类似的行为可能不那么明显吗?
答案 0 :(得分:3)
原语(null,布尔值,数字,字符串等)按值传递。设置变量会将该值存储在变量中。设置另一个变量会将值复制到该变量中。它们是两个不同的东西。
对象(数组,函数,对象,正则表达式等)通过引用传递。变量只是指向该对象存储位置的指针。将第二个变量设置为第一个复制引用(不是值)。这两个变量现在都指向内存中的同一个对象。此外,覆盖其中一个变量意味着变量不再指向原始对象......但它不会对该原始对象执行任何操作,它只会失去对它的引用。
答案 1 :(得分:0)
你有两个变量都引用同一个数组 对该数组实例的更改将反映在两个变量中。
这种情况不会发生在数字上,因为数字是不可变的 - 不可能改变现有的数字值。
答案 2 :(得分:0)
变量c
是对数组的引用,当你说d = c;
时,你所拥有的是2个不同的vars,指向同一个数组。
您的代码:
var c = [1, 2, 3];
var d = c;
d[0] = "hi";
console.log(c);
然后做这样的事情:
d=null;
console.log(c); // same result
我们上面所做的只是告诉d
它现在引用null
,c
继续引用数组。