参考文章:slice()
slice
方法用于提取目标数组的一部分,返回一个新数组,原数组不变。
arr.slice(start, end);
复制代码
它的第一个参数为起始位置(从0开始),第二个参数为终止位置(但该位置的元素本身不包括在内)。
- 注意:如果省略第二个参数,则一直返回到原数组的最后一个成员。
var a = ['a', 'b', 'c'];
a.slice(0) // ["a", "b", "c"]
a.slice(1) // ["b", "c"]
a.slice(1, 2) // ["b"]
a.slice(2, 6) // ["c"]
a.slice() // ["a", "b", "c"]
复制代码
上面代码中,最后一个例子:如果不给slice()
传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复制一个Array
。
- 如果
slice
方法的参数是负数,则表示倒数计算的位置(最后一位为-1)。
var a = ['a', 'b', 'c'];
a.slice(-2) // ["b", "c"]
a.slice(-2, -1) // ["b"]
a.slice(-1) // ["c"]
复制代码
上面代码中,-2表示倒数计算的第二个位置,-1表示倒数计算的第一个位置。
- 如果第一个参数大于等于数组长度,或者第二个参数小于第一个参数,则返回空数组。
var a = ['a', 'b', 'c'];
a.slice(4) // []
a.slice(2, 1) // []
复制代码
slice
方法的一个重要应用,是将类似数组的对象转为真正的数组。
Array.prototype.slice.call({ 0: 'a', 1: 'b', length: 2 })
// ['a', 'b']
复制代码
上面代码的参数都不是数组,但是通过call
方法,在它们上面调用slice
方法,就可以把它们转为真正的数组。
- slice实现数组中对象的浅拷贝。
var a = [{a:1},{b:2}];
var b = a.slice(0,1);//undefined
comsole.log(b)//[{a:1}]
a[0].a=2;
comsole.log(b)//[{a:2}]
复制代码
splice()
方法是修改Array的万能方法。 splice
方法用于删除原数组的一部分成员,并可以在删除的位置添加新的数组成员,返回值是被删除的元素。
- 注意,该方法会改变原数组。
arr.splice(start, count, addElement1, addElement2, ...);
复制代码
splice
的第一个参数是删除的起始位置(从0开始),
第二个参数是被删除的元素个数。
如果后面还有更多的参数,则表示这些就是要被插入数组的新元素。
- 既删除又添加
var a = ['a', 'b', 'c', 'd', 'e', 'f'];
a.splice(4, 2, 1, 2) // ["e", "f"]
a // ["a", "b", "c", "d", 1, 2]
复制代码
- 只删除,不添加:
var a = ['a', 'b', 'c', 'd', 'e', 'f'];
a.splice(4, 2) // ["e", "f"]
a // ["a", "b", "c", "d"]
复制代码
- 只添加,不删除
var a = [1, 1, 1];
a.splice(1, 0, 2) // []
a // [1, 2, 1, 1]
复制代码
- 起始位置如果是负数,就表示从倒数位置开始删除。
从倒数第四个位置c
开始删除两个成员。
var a = ['a', 'b', 'c', 'd', 'e', 'f'];
a.splice(-4, 2) // ["c", "d"]
复制代码
- 如果只提供第一个参数,等同于将原数组在指定位置拆分成两个数组。
var a = [1, 2, 3, 4];
a.splice(2) // [3, 4](从2号位开始删除的元素)
a // [1, 2]
复制代码