ECScript 3 中仿照 ECScript5 中数组的map方法写法,代码中那个if判断有无必要?


//ECScript3中模仿ECScript5中的map方法


 Array.prototype.map = Array.prototype.map || function(f){

    var caller = arguments.callee.caller;

    var results = [];
    for(var i = 0; i< caller.length; i++){
    //下面这个if判断还有没有必要?看到书上有这个if判断    
      if(i in caller)  results[i] =   f.call(null,caller[i],i,caller);      
    }

    return results;
};

前端 web前端开发 JavaScript

可以故意2 10 years, 9 months ago

 // ES5 环境下
var arr = [1,,,,,6]; // 这个数组第2至第5项为 undefined
arr.map(function(item) {
   console.log(item);
});
// 1
// 6
// 前面是 console.log 的结果,下面是 arr.map() 的返回值
// [undefined, undefined, undefined, undefined, undefined, undefined]

这个 i in caller 就是用来判断数组里的第i项是否存在 (是否是 undefined )。如果是则不传递给 f 去处理。

如果没有 i in caller ,则在 console 里面会出现 7 行记录。这样和原生的 map 方法的行为就不一致了。

in 是专门用来判断一个 object 是否包含某个属性的。

一根懒呆毛 answered 10 years, 9 months ago

Your Answer