callback
必须是一个函数,接收三个参数并且返回一个布尔值。
如果提供了thisArg
参数,它将用作每次调用callbackfn
时的this
值。如果没有提供,用Undefined
代替。
执行filter
方法的步骤:
- 判断传入的回调不是一个函数,抛出异常
- 创建一个存放结果的数组
- 遍历数组中的每个元素
- 如果有第二个参数,则将回调函数的this指向第二个参数,默认为undefined,即this为当前调用对象
- 调用回调函数,将符合条件的结果进行返回
//1.实现filter方法
Array.prototype.filter1 = function (callback, thisArg) {
if (Object.prototype.toString.call(callback) != "[object Function]")
return new Error("参数不是一个函数");
//存放结果
let result = [];
//拷贝this
let array = Object.create(this);
//thisArg如果有,会被作为callback被调用时的this值,否则this值在非严格模式下将是全局对象
if (thisArg === undefined) {
//callback(element[, index[, array]])[, thisArg]
//为什么不用for循环而是用for...in?
for (let i = 0; i < array.length; i++) {
// callback(array[i], i, array);
//怎么判断是结果集中的数据?调用callback,返回值是一个boolean类型的值
if (callback(array[i], i, array)) {
result.push(array[i]);
}
}
} else {
for (let i = 0; i < array.length; i++) {
// callback(array[i], i, array);
//怎么判断是结果集中的数据?调用callback,返回值是一个boolean类型的值
if (callback.call(array[i], i, array)) {
result.push(array[i]);
}
}
}
return result;
};
网友评论