手写数组方法(五):every

641 阅读2分钟

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

语法

array.every(function(item, index, arr), ins)

参数

参数1:回调函数(必需

参数2:传递给回调函数的this指针(可选)

:当回调函数是箭头函数时,参数2无效,始终指向全局window变量

回调函数

参数1:当前元素

参数2:当前元素的下标

参数3:原数组

let list = [1, 2, 3];
list.every((item, index, arr) => {
    console.log(item, index, arr);
});

c5ef75c538a5a1367862da969672962.png

this指针

let list = [1, 2, 3];
let ins = { haha: '我的传进来的this' };
list.every(function () {
    console.log(this);
}, ins);

image.png

如果不传,默认是全局window变量:

let list = [1, 2, 3];
list.every(function () {
    console.log(this);
});

image.png

返回值

布尔值。如果所有元素都通过检测返回 true,否则返回 false。

let list = [1, 2, 3];
let res = list.every(item => item > 0);
console.log(res);

image.png

我们让其中一个不通过:

let list = [1, 2, 3];
let res = list.every(item => item > 1);
console.log(res);

image.png

疑问

刚刚我们在打印回调函数参数的时候,只打印了一次,因为我们没有写检测条件,我们猜测没写条件默认就是不满足,所以直接return false出来了:

let list = [1, 2, 3];
let res = list.every(item => {
    console.log(item);
});
console.log(res);

image.png

感受下以下几个例子:

全部满足情况:(需要全部遍历)

image.png

第一个就不满足:(只需遍历这一个)

image.png

中间不满足:(遍历到不满足的元素就会停止遍历)

image.png

总结

every在遍历过程中只要有一个元素不满足条件就会结束遍历,并且返回false

手写

理清需求

  • 函数接收2个参数,一个回调函数,一个this指向
  • 函数会遍历数组每一项,如果所有元素都通过,则返回true,否则返回false
  • 回调函数接收3个参数:当前元素、下标、原数组
  • 回调函数可通过函数的第二个参数改变this指向 根据需求,不难写出以下代码:
Array.prototype._every(function (callback, ins) {
    let res = true;
    for (let i = 0; i < this.length; i++) {
        if (!callback.call(ins, this[i], i, this)) {
            res = false;
            break;
        }
    }
    return res;
})

测试

let list = [1, 2, 3];
let res = list._every(function (item) {
    console.log(this);
    return item < 2;
}, { haha: '我是传进来的this' });

image.png

原生验证

image.png

没毛病!完美马路比~

结语

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