现如今的前端面试中,常常会考察候选人的编码能力。不仅会考察基本的数据结构与算法,还会考察javascript基本功,看候选人对js基础的理解和掌握程度。
面试官:请你简单实现一下数组方法some
要想实现一个东西,必须要懂这个东西是做什么用的,some的基本功能是遍历一个数组,判断是否有一个数组元素满足条件,若有满足的返回true,若都不满足则返回false,不改变原有数组。
some方法接收两个参数,第一个参数是一个函数,第二个参数是改变this指向的值(很多人都没注意到)。 函数接收三个参数,分别为数组每一项、数组的下标以及数组本身。
let arr = [1, 2, 3];
let res = arr.some((item, index, array) => {
return item === 2
}, thisArg)
// res = true
复制代码
懂了some是什么了之后,我们就可以用代码实现他啦~
第一步:把some方法挂载到Array构造函数的原型上来进行模拟,并定义方法的返回值
Array.prototype.mySome = function () {
let result = [];
return result;
}
第二步:确定回调函数的this指向,看是否传了第二个参数
Array.prototype.mySome = function () {
let result = [];
let context = arguments[1] || window;
return result;
}
第三步:判断传的第一个参数是否为函数,若不是则抛出一个错误
Array.prototype.mySome = function (fn) {
let result = [];
let context = arguments[1] || window;
if (typeof fn === 'function') {
} else {
throw new Error('parameter1 is not a function')
}
return result;
}
第四步:对数组进行遍历处理
这里使用ES3的call方法调用函数,并指定this指向,依次传入数组项、下标以及数组自身,若有满足条件的数组项则直接返回true,若都不满足则返回false。
Array.prototype.mySome = function (fn) {
let result = [];
let context = arguments[1] || window;
if (typeof fn === 'function') {
for (let i = 0; i < this.length; i++) {
let condition = fn.call(context, this[i], i, this)
if (condition) {
return true;
}
}
return false;
} else {
throw new Error('parameter1 is not a function')
}
return result;
}