每天一题,坚持思考
题目
实现every函数,通过函数检查数组中每一个元素是否都返回真值。一旦返回假值,那么久终止遍历数组。
every([1, 3, 1, 0, 5], function (item) { return item; }); // false
every([3, 4, 5, 6, 8], function (item, index) { return item > index; });// true
具体实现
// 判断参数args是否为数组类型,这里借用Object对象上的toString方法来进行判断
function isArray(args) {
if (Object.prototype.toString.call(args) === '[object Array]') {
return true;
}
}
function every(array, executor, context) {
// 判断当前array是否为数组并且长度不为0
if (isArray(array) && array.length) {
// 判断executor类型为函数
if (typeof executor === 'function') {
var index = -1,
length = array.length;
// 遍历
while (++index < length) {
// 使用call绑定executor函数的this指向和执行函数
// 如果返回值取反后为false,那么就停止遍历并返回,否则返回true
if (!executor.call(context, array[index], index, array)) {
return false;
}
}
return true;
} else {
return false;
}
} else {
return false;
}
}
实现思路
参数:
array(Array):被查询的数组;executor(Function): 每次遍历执行的函数(当前数组成员, 当前索引值, 遍历的数组);context(*):上下文对象,也就是回调函数中的this绑定的值,默认就是undefined; ;
步骤:
- 判断当前的
array参数是否为数组,并且判断该数组的长度; - 判断
executor的类型是否为函数,如果不是则返回false; - 这里使用
while遍历,第一次遍历时index的值为0,最后index的值等于数组的长度值; - 最后这里使用
call方法绑定executor函数的this,如果context没有传入,那么默认就是undefined,浏览器环境下this指向的是顶级对象,也就是window;调用executor后的返回值如果是true,则继续遍历,否则就会跳出循环,返回false;
如果读者发现有不妥或者可以改善的地方,欢迎在评论区指出。如果觉得写得不错或者对你有所帮助,可以点赞、评论、转发分享,谢谢~