slice(0)

今天看代码时看到了 slice(0) 的写法,简单研究了一下。

JS 中对象(数组也是对象)是索引传递的,赋值时会被共享,而不是复制副本。所以只要一个对象被修改,被赋值的变量也会被改变。

1
2
3
4
5
6
var arr1 = ['George','John','Thomas','James','Adrew','Martin'];
var arr2 = arr1;

arr1.push('Jane');

console.log('arr2:'+ arr2);

打印结果为:

1
'George','John','Thomas','James','Adrew','Martin','Jane'

因为 arr1 和 arr2 共享一个数据,当我们使用其中一个变量(arr1)修改对象数据时,另一个(arr2)也会跟着修改,slice(0) 则可以避免这个问题。

1
2
3
4
5
6
7
var arr1 = ['George','John','Thomas','James','Adrew','Martin'];
var arr2 = arr1.slice(0);

arr1.push('Jane');

console.log('arr1:'+ arr1);
console.log('arr2:'+ arr2);

打印结果为:

1
2
'George','John','Thomas','James','Adrew','Martin','Jane'
'George','John','Thomas','James','Adrew','Martin'

由此可见,添加 ‘Jane’ 的行为只影响了被操作的数组,但并不会影响“复制”出来的新数组。slice(0) 实现了深复制(deep copy),得到一个完全独立的数组。