a=[1,2,3,4];
b=a;
c=b;
c.splice(3,1," ");
console.log(a); //输出是[ 1, 2, 3, ' ' ]
e=2;
d=e;
f=d;
f=3;
console.log(e);//输出是2
为什么会这样?还有我怎么才能让c数组经过splice 后不影响数组a的值呢?
a=[1,2,3,4];
b=a;
c=b;
c.splice(3,1," ");
console.log(a); //输出是[ 1, 2, 3, ' ' ]
e=2;
d=e;
f=d;
f=3;
console.log(e);//输出是2
为什么会这样?还有我怎么才能让c数组经过splice 后不影响数组a的值呢?
首先要理解JavaScript中的赋值
对于数组
和对象
,是引用赋值,不会拷贝一份,而只是一个指针,指向的是同一份数据。
所以要么拷贝
一份你的数组
简单的数组拷贝,假设数组元素中没有数组或者对象
var a = [1, 2, 3, 4];
var b = a.slice();
此时b和a是两份独立的数据
或者使用无副作用的数组方法(splice
方法会改变原数组)
例如用slice
等不会改变原数组的方法替代
题主没分清楚赋值的主要两种情况:一个是赋值的是原始类型如数值、布尔值,另一个是对象。
如果你学过c/c++等语言,大概也能知道一点,那就是 对象赋值 相当于是 赋值的是对象的地址。
所以当b=a
时,b只是跟a一样指向了同一个对象 ,所以改b指向的内容,a也会跟着变化 ,因为他们指的同一个地方。
这标题不妥,如果你想不影响到数组a的话,不妨用slice
b = a.slice(0);//返回的是a数组的一个拷贝
..........
javascript 三种数组复制方法,对于webkit, 使用concat; 其他浏览器, 使用slice.
一. 三种数组复制方法
1. by slice
var arr = [1, 2, 3], copyArr;
copyArr = arr.slice();
2. by concat
var arr = [1, 2, 3], copyArr;
copyArr = arr.concat();
3. by loop
var arr = [1, 2, 3], copyArr = [];
for (var i=0, j=arr.length; i
首先你要先了解一下splice方法,可以看看w3school的解释:JavaScript splice() 方法

需要特别注意一下:
而你的b和c都是对a数组的内存引用,所以你想要的是一个深拷贝。
可以看看下面这两种方式:
1、js的slice函数
代码如下:
2、js的concat方法
代码如下: