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]