JavaScript数组赋值疑问:修改z为何会让x从[1,2,3]变为[1,2,4]?
为什么修改
z会影响x? 这是因为在JavaScript里,数组属于引用类型,和数字、字符串这类基本类型的赋值逻辑完全不一样。咱们一步步拆解你的代码来理解:
- 执行
var x = [1, 2, 3];时,内存里会创建一个实际的数组对象[1,2,3],而变量x保存的并不是这个数组的内容,而是指向这个数组的引用地址——相当于x拿着一张写着数组位置的纸条。 - 接着
var z = x;这一步,不是把x的数组完整复制一份给z,而是把x手里的那张“地址纸条”直接递给了z。现在x和z拿着的是同一张纸条,指向内存里同一个数组对象,就像两个人共用同一把钥匙,打开的是同一个房间。 - 最后执行
z[2] = y[0];,其实是通过z的引用找到那个共用的数组,把索引2的位置改成了y[0]的值也就是4。既然x指向的是同一个数组,那用console.log(x)输出时,自然会看到修改后的结果[1, 2, 4]。
如果想让z成为x的独立副本,修改z不影响x,可以用这些方法:
- 展开运算符:
var z = [...x]; Array.from()方法:var z = Array.from(x);- 数组切片:
var z = x.slice();
这样z就会指向一个全新的数组对象,和x各自独立,后续修改其中一个就不会影响另一个了。
内容的提问来源于stack exchange,提问作者Debbot
相关产品推荐
相关产品推荐

