最近经常看到如何实现原生方法的文章,之前自己对于这些并没有特别在意,看了几篇之后发现还是挺有意思的,搞清楚其中的原理比业务代码有趣多了。今天来记录一下数组的map和filter方法
参考资料:
Array.prototype.myMap
在实现map方法之前,有一个要注意的地方在于,map方法有一个很少用到的第二个参数,作为回调函数的作用域对象。即
arr.map(fn(item, index, arr) => {}, obj)
中的obj
。虽然平时用得少,但是实现的时候要记得考虑进去。
// 一般实现
Array.prototype.myMap = function() {
let arr = this;
let result = [];
let [fn, obj] = Array.prototype.slice.call(arguments);
if (!arr instanceof Array) {
throw new TypeError('Array only!');
}
if (typeof fn !== 'function') {
throw new TypeError(`${
fn} is not a function!`);
}
for (let i = 0; i < arr.length; i++) {
const item = f