回顾 unshift
unshift() 方法将指定元素添加到数组的开头,并返回数组的新长度。
该方法的调用直接修改原数组,即原数组内容发生变化。
用法示例
let arr1 = [1, 2, 3, 4];
console.log(arr1.unshift(7, 8, 9)); // 7
console.log(arr1); // [7, 8, 9, 1, 2, 3, 4]
let arr2 = [1, 2, 3, 4];
arr2.unshift(7);
arr2.unshift(8);
arr2.unshift(9);
console.log(arr2); // [9, 8, 7, 1, 2, 3, 4]
手写 customUnshift 的思路
- 确定新元素数量
- 将原数组中的旧元素依次往后挪,给新元素腾出空间
- 逐一将新元素放置在开头
- 保持引用不变
- 返回新长度
注意这里只考虑 unshift() 被数组调用的情况,不考虑被类数组对象使用。
代码实现
let arr = [1, 2, 3, 4];
Array.prototype.customUnshift = function (...elements) {
for (let i = this.length - 1; i >= 0; i--) {
this[i + elements.length] = this[i];
}
for (let i = 0; i < elements.length; i++) {
this[i] = elements[i];
}
return this.length;
};
console.log(arr.customUnshift(7, 8, 9)); // 7
console.log(arr); // [ 7, 8, 9, 1, 2, 3, 4 ]
解析
- 原数组 arr 的长度为4,新元素的长度为3。要把数字1 2 3 4往后挪出三个位置
- 第一次迭代就是挪位置。把数字1挪到索引为3的地方,把数字2挪到索引为4的地方,以此类推
第一次迭代后的结果为 arr = [1, 2, 3, 1, 2, 3, 4] - 第二次迭代,开始将数字7 8 9代替掉最开头的1 2 3
第二次迭代后的结果为 arr = [7, 8, 9, 1, 2, 3, 4] - 注意所有的操作都在原数组上,因为unshift()就是根本上改变了原数组,而不是新起一个数组
- 最后返回最新的数组长度