Array.prototype.slice()
Array.prototype.slice() 方法用于浅拷贝指定区间的数组成员。
语法
语法:
arr.slice( start [, end ] );
类型声明:
interface Array<T> {
  slice(start?: number, end?: number): T[];
}
参数说明:
| 参数 | 说明 | 类型 | 
|---|---|---|
| start | 浅拷贝区间的开始索引 | number | 
| end | 浅拷贝区间的结束索引,浅拷贝不包括该索引所得值 | number | 
返回值:
返回一个含有提取元素的新数组。
方法说明
slice 方法不修改原数组,只会返回浅拷贝原数组的新数组。
原数组的元素会按照下述规则拷贝:
- 如果该元素是个对象引用 (不是实际的对象),slice会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变。
- 对于字符串、数字及布尔值来说,slice会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或是布尔值,将不会影响另一个数组。 如果向两个数组任一中添加了新元素,则另一个不会受到影响。
slice() 方法涉及到 Number() 转型函数的隐式类型转换,当 start 被转换为 NaN 时,相当于 start 为 0;当 end 被转换为 NaN 时(end 为 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]