#也不知道有没有人跟我一样老是混了unshift和shift,不过问题不大,这篇主要记录一下unshift底层实现与手动实现unshift效果#
底层实现逻辑
重新分配一个更大的数组,并将旧元素复制到新数组,然后在新数组上执行操作。
手动实现
创建新数组
Array.prototype.myUnshift = function () {
const curLen = this.length; // 当前数组长度
const argsLen = arguments.length; // 入参数量
const newArray = new Array(curLen + argsLen); // 分配一个更大的数组
// 把原数组的元素复制到新数组
for (let i = 0; i < curLen; i++) {
newArray[i + argsLen] = this[i];
}
// 把入参元素复制到新数组
for (let i = 0; i < argsLen; i++) {
newArray[i] = arguments[i];
}
// 更新数组长度
this.length = newArray.length;
// 把新数组的元素复制回原数组
for (let i = 0; i < this.length; i++) {
this[i] = newArray[i];
}
return this.length; // 返回新长度
}
原数组上修改
Array.prototype.myUnshift = function () {
const len = arguments.length; // arguments 入参
for (let i = len - 1; i >= 0; i--) {
this.splice(0, 0, arguments[i]); // this 当前数组
}
return this.length; // 返回新长度
}
测试
let arr = [1, 2, 3]
console.log(arr.myUnshift(4, 5), arr) // 5 [4, 5, 1, 2, 3]