代码改变世界

ECMAScript5新增数组API的一些细节

2014-09-21 23:44    阅读(141)  评论(0)    收藏  举报
ECMAScript5新增的数组方法看似都比较简单其实还是有一些细节需要了解的
首先这些方法都不会作用于原数组,其次是在对稀松数组的处理上.

(1)这些方法在稀松数组缺少的元素上都不会执行回调函数
(2)map的返回值包括稀松数组缺少的元素,而filter方法会过滤掉稀松数组的缺少元素,从而返回的都是一个紧凑的数组

在一些不支持这些方法的游览器中我们是如何实现这些方法呢
首先要处理的问题是在迭代过程中如何过滤掉缺少元素,用
for (var i = 0; i < arr.length; i++)的循环方法是行不通的,因为数组的长度是包括缺失元素的,并且我们不能通过undefined来判断这是否是一个缺少元素还是故意设置的undefined值,其实想想js数组的特殊性这个问题还是很好解决的我们直接用for in便可过滤掉缺失的元素

下面给出在不支持这些方法的游览器上我们如何自己实现 
var each = Array.prototype.forEach ?   Array.prototype.forEach  : function(callback) {
               var arr=this;
               for (var i in arr) {
                    var item = arr[i];
                    callback.call(item, item, i, arr);
               }
          }
          Array.prototype.each = each;
 
          var map = Array.prototype.map ?   Array.prototype.map  : function(callback) {
               var arr = this;
               var _arr = arr.slice(0);
               for (var i in arr) {
                    var item = arr[i]
                    _arr[i] = callback(item, item);
               }
               return _arr;
          }
          Array.prototype.map = map;

          var filter= Array.prototype.filter ? Array.prototype.filter : function(callback) {
               var r = [];
               var arr = this;
               for (var i in arr) {
                    var item = arr[i];
                    if(callback.call(item, item)) {
                         r.push(item);
                    }
               }
               return r;
          }
          Array.prototype.filter = filter;