array.prototype.slice() 是一维数组浅拷贝最常用方式,它创建新数组实例使第一层元素独立,但嵌套对象仍共享引用;直接赋值仅复制引用导致原数组被意外修改。

用 Array.prototype.slice() 复制一维数组,是 JavaScript 中实现浅拷贝最常用、最简洁的方式之一。它能避免直接赋值(=)导致的引用共享问题,让新数组拥有独立的内存空间(仅限第一层)。
为什么直接赋值不行?
直接赋值只是复制了数组的引用,新旧变量指向同一块内存:
const arr1 = [1, 2, 3]; const arr2 = arr1; // ❌ 不是拷贝,是引用 arr2.push(4); console.log(arr1); // [1, 2, 3, 4] —— arr1 也被改了!
slice() 如何实现浅拷贝?
slice() 不修改原数组,返回一个从开始到结束(不包括结束)的新数组。不传参数时,默认复制整个数组:
-
arr.slice()等价于arr.slice(0)或arr.slice(0, arr.length) - 返回的是一个**新数组实例**,与原数组内存分离(一维情况下元素值被独立复制)
- 适用于所有类数组对象和真数组(包括空数组)
实际用法示例
✅ 正确的一维数组浅拷贝:
const original = [1, 2, 3, 'hello'];
const copy = original.slice(); // ✅ 浅拷贝
copy.push('world');
console.log(original); // [1, 2, 3, 'hello'] —— 原数组未变
console.log(copy); // [1, 2, 3, 'hello', 'world']
注意事项:它只是浅拷贝
slice() 只复制第一层引用。如果数组包含对象或嵌套数组,内部元素仍共享引用:
const arr = [{ name: 'Alice' }, [10, 20]];
const cloned = arr.slice();
cloned[0].name = 'Bob'; // ❗ 修改影响原数组
console.log(arr[0].name); // 'Bob'
cloned[1].push(30); // ❗ 同样影响原数组
console.log(arr[1]); // [10, 20, 30]
此时需考虑深拷贝(如 JSON.parse(JSON.stringify())、结构化克隆或第三方库),但对纯一维原始值数组,slice() 完全够用且高效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











