手写数组方法(十九):shift

240 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情

昨天写了pop方法,今天来讲讲shift

语法

arr.shift()

shift 方法从一个数组中删除并返回第一个元素。

返回值

从数组中删除的元素(当数组为空时返回undefined)。

例子

let list = [1, 2, 3];
list.shift();

image.png

当数组为空时:

let list = [];
list.shift();

image.png

call,apply一起使用:

let fruits = ['apple', 'orange', 'banana'];
Array.prototype.shift.apply(fruits);

image.png

let fruits = ['apple', 'orange', 'banana'];
Array.prototype.shift.call(fruits);

image.png

let fruit = {name: 'apple', weight: '300g', length: 3};
Array.prototype.shift.call(fruit);

image.png

shift 方法并不局限于数组:这个方法能够通过 call 或 apply 方法作用于类似数组的对象上。但是对于没有 length 属性(从 0 开始的一系列连续的数字属性的最后一个)的对象,调用该方法可能没有任何意义。

手写

Array.prototype._shift = function() {
    if(!this.length) return undefined;
    let res = this[0];
    let temp = [...this];
    for(let i = 0; i < this.length; i++) {
        this[i] = temp[i+1];
    }
    this.length -= 1;
    return res;
}

image.png

没问题,我们能否不借助临时变量来调整数组顺序呢?

Array.prototype._shift = function() {
    if(!this.length) return undefined;
    let res = this[0];
    for(let i = 0; i < this.length; i++) {
        this[i] = this[i + 1];
    }
    this.length -= 1;
    return res;
}

测了一下结果是一样的,这边把数组的后一位的值赋值给前一位,并不会导致数据丢失,所以不需要引入变量保存原始数组。

应用

在日常开发中,有种场景需要你删除数组第一个元素,还得把它保存起来,那这时候用shift是不二选择。不然你还得定义一个变量等于数组的第一个元素,多此一举。

结语

今天关于数组shift的介绍就讲到这里,关注我获取更多有关数组方法的讲解,后续会持续更新。我是末世未然,一个爱折腾的新晋奶爸,祝好