Array.prototype.slice() 方法用于浅拷贝指定区间的数组成员。
arr.slice( startIndex [, endIndex ] );
| 参数 | 说明 | 类型 |
|---|---|---|
startIndex | 浅拷贝区间的开始索引。 | number |
endIndex | 浅拷贝区间的结束索引,浅拷贝不包括该索引所得值。 | number |
返回值: 一个含有提取元素的新数组。
slice 方法不修改原数组,只会返回浅拷贝原数组的新数组。原数组的元素会按照下述规则拷贝:
slice 会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变。slice 会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或是布尔值,将不会影响另一个数组。 如果向两个数组任一中添加了新元素,则另一个不会受到影响。⚠️ slice() 方法涉及到 Number() 转型函数的隐式类型转换,当 startIndex 被转换为 NaN 时,相当于 startIndex 为 0;当 endIndex 被转换为 NaN 时(endIndex 为 undefined 除外),则输出空数组。
const arr = [1, 2, 3, 4, 5];arr.slice(1);// [2, 3, 4, 5]arr.slice(0, 2);// [1, 2]arr.slice(1, 2);// [2]arr.slice(NaN);// [1, 2, 3, 4, 5]arr.slice(0, NaN);// []arr.slice(true, [3]);// [2, 3]arr.slice(null, undefined);// [1, 2, 3,4, 5]arr.slice({});// [1, 2, 3, 4, 5]arr.slice('2', [5]);// [3, 4, 5]
var fruits = ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango'];var citrus = fruits.slice(1, 3);// fruits contains ['Banana', 'Orange', 'Lemon', 'Apple', 'Mango']// citrus contains ['Orange','Lemon']
slice 方法可以用来将一个类数组对象转换成一个真正的数组。你只需将该方法绑定到这个对象上。
function list() {return Array.prototype.slice.call(arguments);}const arr = list(1, 2, 3);// [1, 2, 3]
除了使用 Array.prototype.slice.call(arguments),你也可以简单的使用 [].slice.call(arguments) 来代替。另外,你可以使用 bind 来简化该过程。
const unboundSlice = Array.prototype.slice;const slice = Function.prototype.call.bind(unboundSlice);function list() {return slice(arguments);}const arr = list(1, 2, 3);// [1, 2, 3]