这是一个非常典型的 JavaScript 面试题,考察对数组方法副作用的理解。
✅ 直接答案:
splice():会改变原数组 ✅slice():不会改变原数组 ❌
🔍 详细解释
1. splice() —— 会修改原数组
splice() 是一个破坏性方法(mutating method),它直接修改原数组,并返回被删除的元素。
语法:
array.splice(start, deleteCount, item1, item2, ...)
示例:
const arr = [1, 2, 3, 4, 5];
// 从索引 2 开始,删除 2 个元素
const removed = arr.splice(2, 2);
console.log(removed); // [3, 4](被删除的元素)
console.log(arr); // [1, 2, 5](原数组被修改!)
✅
splice()常用于添加、删除或替换数组中的元素,总是改变原数组。
2. slice() —— 不会修改原数组
slice() 是一个纯函数(non-mutating method),它返回一个新数组,原数组保持不变。
语法:
array.slice(start, end)
示例:
const arr = [1, 2, 3, 4, 5];
// 从索引 1 到 3(不包括 3)
const subArray = arr.slice(1, 3);
console.log(subArray); // [2, 3](新数组)
console.log(arr); // [1, 2, 3, 4, 5](原数组未变)
✅
slice()常用于截取数组片段、浅拷贝数组(arr.slice())等,安全且无副作用。
✅ 对比总结
| 方法 | 是否改变原数组 | 返回值 | 常见用途 |
|---|---|---|---|
splice() | ✅ 是 | 被删除元素组成的数组 | 删除、插入、替换元素 |
slice() | ❌ 否 | 新数组(原数组的子集) | 截取、拷贝数组 |
✅ 记忆技巧
splice→ “sp” 可以联想为 “spoil”(破坏),会“破坏”原数组。slice→ “sl” 联想为 “safe”(安全),安全地切片,不伤原数组。
✅ 面试回答模板
splice()和slice()的最大区别在于是否改变原数组:
splice()会直接修改原数组,用于删除、插入或替换元素;slice()不会修改原数组,而是返回一个新数组,常用于截取或拷贝。这是 JavaScript 中典型的“破坏性方法”和“纯函数”的对比,使用时需注意副作用,尤其在函数式编程中应优先选择
slice()保证不可变性。
THE END


