splice()
方法的简化版源码实现:
Array.prototype.splice = function(start, deleteCount, ...items) {
// 将 start 转换为有效索引
const index = start < 0 ? this.length + start : start;
// 被删除的元素数组
const deletedItems = [];
// 删除元素
for (let i = 0; i < deleteCount; i++) {
const deletedIndex = index + i;
if (deletedIndex in this) {
deletedItems.push(this[deletedIndex]);
delete this[deletedIndex];
}
}
// 移动元素
const itemCount = items.length;
const delta = itemCount - deleteCount;
if (delta < 0) {
// 删除的元素个数大于插入的元素个数,向前移动元素
for (let i = index + deleteCount; i < this.length; i++) {
const from = i;
const to = i + delta;
if (from in this) {
this[to] = this[from];
delete this[from];
} else {
delete this[to];
}
}
} else if (delta > 0) {
// 插入的元素个数大于删除的元素个数,向后移动元素
for (let i = this.length - 1; i >= index + deleteCount; i--) {
const from = i;
const to = i + delta;
if (from in this) {
this[to] = this[from];
delete this[from];
} else {
delete this[to];
}
}
}
// 插入新元素
for (let i = 0; i < itemCount; i++) {
this[index + i] = items[i];
}
// 更新数组长度
this.length += delta;
// 返回被删除的元素数组
return deletedItems;
};