什么时候" ="不只是在Javascript中分配?

时间:2015-07-27 00:09:41

标签: javascript

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?!

我想" ="只将事物分配给变量,但是在数组的情况下,似乎" ="使两个数组直接相互链接。使用" ="使用整数(作为示例)不会产生相同的行为。为什么是这样?这让我重新思考如何为数组创建单独的存储位置。还有其他类似的行为可能不那么明显吗?

3 个答案:

答案 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它现在引用nullc继续引用数组。