js实现splice

实现 splice 方法
JavaScript 的 splice 方法用于修改数组,可以删除、替换或添加元素。以下是手动实现 splice 的方法:

基本功能实现
function customSplice(array, start, deleteCount, ...items) {
// 处理负数索引
const normalizedStart = start < 0
? Math.max(array.length + start, 0)
: Math.min(start, array.length);
// 处理未指定 deleteCount 的情况
const actualDeleteCount = deleteCount === undefined
? array.length - normalizedStart
: Math.min(Math.max(0, deleteCount), array.length - normalizedStart);
// 创建被删除元素的数组
const deletedElements = array.slice(normalizedStart, normalizedStart + actualDeleteCount);
// 计算需要移动的元素数量
const elementsToMove = array.length - normalizedStart - actualDeleteCount;
const newLength = array.length - actualDeleteCount + items.length;
// 移动元素
if (items.length !== actualDeleteCount) {
// 如果添加和删除的数量不同,需要调整数组大小
if (items.length < actualDeleteCount) {
// 向左移动元素
for (let i = normalizedStart + items.length; i < newLength; i++) {
array[i] = array[i + (actualDeleteCount - items.length)];
}
array.length = newLength;
} else {
// 向右移动元素
array.length = newLength;
for (let i = newLength - 1; i >= normalizedStart + items.length; i--) {
array[i] = array[i - (items.length - actualDeleteCount)];
}
}
}
// 插入新元素
for (let i = 0; i < items.length; i++) {
array[normalizedStart + i] = items[i];
}
return deletedElements;
}
使用示例
const arr = [1, 2, 3, 4, 5];
const deleted = customSplice(arr, 1, 2, 'a', 'b');
console.log(arr); // [1, "a", "b", 4, 5]
console.log(deleted); // [2, 3]
边界情况处理
- 当
start为负数时,从数组末尾开始计算 - 当
deleteCount为 0 或负数时,不删除任何元素 - 当
deleteCount大于可删除元素数量时,只删除到数组末尾 - 当
start大于数组长度时,从数组末尾开始操作 - 可以处理任意数量的插入元素
与原生的区别
这个实现模拟了原生 splice 的核心功能,但可能在某些极端情况下表现不同。原生方法是高度优化的,而这个实现主要用于演示原理。
性能考虑
对于大型数组,这个实现可能不如原生方法高效,因为它涉及多次数组元素移动。在实际应用中,通常应优先使用原生 splice 方法。






