面试题:JavaScript 的 splice 和 slice 函数会改变原数组吗?

这是一个非常典型的 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
喜欢就支持一下吧
点赞7 分享