slice()复制数组子集是浅拷贝,仅第一层独立,嵌套引用类型仍共享;适用于纯值截取、分页、函数式处理等场景,深拷贝需配合JSON或structuredClone。

JavaScript 中用 slice() 复制数组子集,本质是浅拷贝——它只复制数组第一层元素的引用,不递归处理嵌套对象或数组。
slice() 的基本用法和浅拷贝特性
slice(start, end) 返回原数组从 start(含)到 end(不含)之间的新数组。它不会修改原数组,且生成的新数组与原数组在第一层是独立的,但若原数组包含对象、数组等引用类型,这些引用会被共享。
-
arr.slice():复制整个数组(常用作浅拷贝) -
arr.slice(1, 4):复制索引 1 到 3 的元素(共 3 个) -
arr.slice(-2):复制最后两个元素
验证浅拷贝行为(重点看嵌套情况)
简单值(如数字、字符串)拷贝后互不影响;但对象、数组等引用类型,修改子项会影响原数组:
const original = [1, 2, { name: 'Alice' }];
const copied = original.slice(0, 2); // 取前两项:[1, 2]
copied[0] = 99;
console.log(original[0]); // 1 → 不影响
const subArray = [1, 2, { age: 25 }];
const shallow = subArray.slice();
shallow[2].age = 30;
console.log(subArray[2].age); // 30 → 原对象被改了
什么时候适合用 slice() 做子集拷贝
适用于:纯值数组截取、临时提取片段、函数式编程中避免副作用。
立即学习“Java免费学习笔记(深入)”;
- 从长列表中取前 N 条做分页展示
- 对某段数据做排序/过滤而不改动原数组
- 配合 map/filter 等方法链式处理时快速切片
注意边界和常见陷阱
slice() 的索引是左闭右开,且支持负数,但超出范围会静默处理(不报错):
-
[1,2,3].slice(5, 10)→ 返回空数组[] -
[1,2,3].slice(1, -1)→ 等价于slice(1, 2),返回[2] - 想深拷贝子集?不能只靠
slice(),需结合JSON.parse(JSON.stringify())或结构化克隆(structuredClone)
不复杂但容易忽略:slice 是浅拷贝,截取的是“视图”,不是“隔离副本”。需要真正独立的数据时,得额外处理嵌套层级。


















