这是一个非常典型的 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