slice()方法返回新数组,实现浅拷贝:基本类型独立复制,引用类型共享内存;支持截取子数组(如slice(1,4))和负数索引,不修改原数组。

用 slice() 方法可以轻松实现数组的浅拷贝,同时还能只复制其中一部分元素。
slice() 默认行为就是浅拷贝整个数组
slice() 不修改原数组,而是返回一个新数组,内容是原数组的浅拷贝。这意味着:新数组和原数组在第一层是独立的,但若数组里包含对象、数组等引用类型,它们的内部引用仍指向同一块内存。
-
注意:即使不传参数(
arr.slice()),也会复制全部元素,且是浅拷贝 - 原数组里的基本类型(如数字、字符串)会被真正复制一份;引用类型(如对象)只是复制了引用地址
用 slice() 复制数组的一部分
只需传入起始索引(start)和结束索引(end,不包含该位置),就能截取子数组并完成浅拷贝:
-
arr.slice(1, 4)→ 复制第 1 位到第 3 位(索引 1、2、3)的元素 -
arr.slice(2)→ 从索引 2 开始复制到末尾 -
arr.slice(-2)→ 复制最后两个元素(支持负数索引)
浅拷贝的典型陷阱示例
看这个常见问题:
const original = [1, 2, { name: 'Alice' }];
const copied = original.slice(0, 2); // 浅拷贝前两个元素 → [1, 2]
copied.push({ name: 'Bob' }); // 只影响 copied,original 不变
// 但如果复制了对象:
const original2 = [1, { age: 25 }];
const part = original2.slice(1); // [{ age: 25 }]
part[0].age = 30; // 原数组 original2[1].age 也会变成 30!
因为 slice() 对对象只复制了引用,没创建新对象。
什么时候适合用 slice() 做浅拷贝?
- 数组元素全是基本类型(数字、字符串、布尔值)时,安全又高效
- 只需要临时截取一段做计算或渲染,不打算深层修改嵌套对象
- 配合函数式写法,比如
[...arr].slice(1)或链式调用arr.filter(...).slice(0, 5)











