为什么非要手写
之前写的一篇文章,比较两个数组内容是否一致,其中就用到了every和some方法,都是ES6数组的迭代方法;
虽然现成的方法用起来爽,但是内部的原理到底是什么,看似简单的方法究竟是如何实现的?
所以如果能自己写一下,好处有:
1、彻彻底底弄明白实现原理和思路
2、巩固自己的原生JS基础
3、给别人装逼,显得自己很专业
自己实现every
先看ES6中的every用法,遍历列表,每一项都符合条件则返回true,否则返回false
例如:
1 2 3
| const list = [1,2,3,4,5] const result = list.every(it => it >= 1) console.log(result)
|
思路:
1、遍历
2、遍历的每一项,都需要符合条件
手写实现的具体代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
const myEveryFn = (arrList, conditionFn) => { let res = true
for (let i = 0; i < arrList.length; i++){ if (!conditionFn(arrList[i])) { console.log('出现了不符合条件的') res = false break } }
return res }
|
自己手写的方法,更加完善的判断、错误异常提醒就暂时不做了,只实现逻辑思路;
可以看到,第一个参数传入一个数组,第二个参数实际是一个判断条件的函数,数组的单独每一项传进去校验,条件函数给出结果;
可以看出我写的,遍历过程中,只要出现了不符合条件的,最终结果直接置为false,break打断循环,直接输出最终结果,节约性能(因为只要有一个不符合,后面的都不用看了)。
原型对象写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Array.prototype.myEvery = function (conditionFn) {
const list = this let res = true
for (let i = 0; i < list.length; i++){ if (!conditionFn(list[i])) { console.log('出现了不符合条件的') res = false break } }
return res }
|
自己实现some
和之前的every同样的思路和道理,遍历过程中,只要有一项符合条件,最终结果直接置为true,后面的同样也不用看了,直接跳出循环节约性能。
手写实现的具体代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
const mySomeFn = (arrList, conditionFn) => { let res = false
for (let i = 0; i < arrList.length; i++){ if (conditionFn(arrList[i])) { console.log('出现了符合条件的!') res = true break } }
return res }
|
原型对象写法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| Array.prototype.mySome = function (conditionFn) {
const list = this let res = false
for (let i = 0; i < list.length; i++){ if (conditionFn(list[i])) { console.log('出现了符合条件的!') res = true break } }
return res }
|
总结
其实就是最基础的遍历,再加上一个条件函数,就能完成;
包括ES6数组的其它迭代方法,像find、filter等,最终只是返回的结果不同而已,过程都是同样的思路和逻辑。