函数式编程:在原型上实现 map 方法使用for循环有问题


#1

为了加深对 map 方法的理解,现在我们来用 forArray.prototype.forEach() 自己实现一下这个方法。
写一个和 Array.prototype.map() 一样的 Array.prototype.myMap() 。你可以用 for 循环或者 forEach 方法。

我这样写会报错,for循环的时候好像会把这个函数也循环了,但是用提示的forEach就不会有问题,为什么呢?
// 全局变量
var s = [23, 65, 98, 5];

Array.prototype.myMap = function(callback){
var newArray = [];
// 请在本行以下添加你的代码
for(let pid in this)
{
newArray.push(callback(this[pid]));
}
// 请在本行以上添加你的代码
return newArray;
};

var new_s = s.myMap(function(item){
return item * 2;
});


#2

你在定义原型方法后,会在array对象上添加一个myMap的属性。for in 实际上是通过遍历Array的属性名来实现的。这样的话会遍历到 s[‘myMap’]元素,此时指向undefined;
undefined *2 得到一个额外的NaN。

具体文档: http://es6.ruanyifeng.com/#docs/iterator#for---of-循环