slice() 是 JavaScript 数组的内置方法,用于浅拷贝数组或截取指定范围元素,不修改原数组;支持正负索引,如 slice(1,4) 返回索引 1–3 的元素,slice(-2) 返回最后两个元素,slice() 或 slice(0) 可实现浅拷贝。

slice() 是 JavaScript 中数组的内置方法,既能实现数组的浅拷贝,也能截取指定范围的元素,且不会修改原数组。
浅拷贝:不传参或传 0
调用 slice() 时不传任何参数(arr.slice())或只传起始索引 0(arr.slice(0)),会返回一个新数组,包含原数组所有元素。
由于是浅拷贝,新数组与原数组在内存中是两个独立对象,修改新数组不会影响原数组;但若原数组中存在对象、数组等引用类型,其内部值仍共享同一内存地址。
const arr = [1, 2, {name: 'Alice'}];const copy = arr.slice();copy.push(4); // arr 不变copy[2].name = 'Bob'; // arr[2].name 也会变成 'Bob'
部分截取:指定起始和结束索引
slice(start, end) 从 start 索引(含)开始,到 end 索引(不含)结束,提取子数组。索引支持负数,表示从末尾计数(-1 是最后一个元素)。
-
[1, 2, 3, 4, 5].slice(1, 4)→[2, 3, 4] -
[1, 2, 3, 4, 5].slice(-3)→[3, 4, 5] -
[1, 2, 3, 4, 5].slice(2, -1)→[3, 4] - 若
start ≥ end或越界,返回空数组[]
常见用途与注意事项
它常用于函数参数处理(如将类数组转为真数组)、分页取数据、去头尾操作等。注意:slice 不会改变原数组,这点和 splice() 有本质区别。
- 类数组转数组:
Array.prototype.slice.call(arguments)或更现代的[...arguments] - 删除前 n 项:
arr.slice(n) - 删除后 n 项:
arr.slice(0, -n) - 越界安全:即使
start或end超出数组长度,也不会报错,自动按边界处理
对比扩展运算符 ...
ES6 后,[...arr] 是更简洁的浅拷贝写法,功能与 arr.slice() 基本一致,也属于浅拷贝。但 slice() 支持截取,而展开语法需配合其他逻辑(如 [...arr].slice(1, 3))才能实现类似效果。
兼容性方面,slice() 支持所有浏览器,展开语法需考虑低版本环境是否支持。










