JavaScript中的变量混淆:为何c[2]=b[0]会使a[2]值改变?
为什么修改数组c会影响数组a?
这是JavaScript里非常常见的引用类型认知误区,我给你一步步讲明白:
首先得搞懂JavaScript里两种数据类型的赋值逻辑:
- 原始类型(数字、字符串、布尔值等):赋值的时候是直接复制「值本身」,相当于复制了一份一模一样的副本,两个变量互不干扰。
- 引用类型(数组、对象、函数等):赋值的时候复制的不是「值本身」,而是这个值在内存里的「地址引用」。也就是说,
var c = a执行后,a和c其实指向的是内存中同一个数组对象,它们就像同一个房间的两把钥匙,不管用哪把钥匙进去改东西,另一把打开看到的都是修改后的房间。
举个实际代码例子你就懂了:
// 定义数组a var a = [1, 2, 3]; // 把a赋值给c,此时c和a指向同一个内存地址的数组 var c = a; // 修改c的第3个元素(假设b[0]是某个具体值,比如4) c[2] = b[0]; // 此时a的第3个元素也变了,因为a和c共享同一个数组 console.log(a[2]); // 会输出和b[0]一致的值
那如果想让c成为a的独立副本,修改c不影响a,该怎么做?可以用这些方法创建数组的浅拷贝:
- 使用
slice()方法:var c = a.slice(); - 使用扩展运算符:
var c = [...a]; - 使用
Array.from():var c = Array.from(a);
这样操作后,c就会是一个全新的数组,和a指向不同的内存地址,两者的修改就不会互相影响啦。
内容的提问来源于stack exchange,提问作者FeCH
相关产品推荐
相关产品推荐

