ECMAScript5新增數組API的一些細節

ECMAScript5新增的數組方法看似都比較簡單其實還是有一些細節需要了解的
首先這些方法都不會作用於原數組,其次是在對稀鬆數組的處理上.

(1)這些方法在稀鬆數組缺少的元素上都不會執行回調函數
(2)map的返回值包括稀鬆數組缺少的元素,而filter方法會過濾掉稀鬆數組的缺少元素,從而返回的都是一個緊湊的數組

var a = new Array(10);
	a[0] = null ;
	a[1] = undefined;
	var _a = a.map(function(){
		return 1;
	});
	console.info(a);//[ null, undefined, , , , , , , , ,  ]
	console.info(_a);//[ 1, 1, , , , , , , , ,  ]

	_a = a.filter(function(){
		return true;
	});
	console.info(_a);//[ null, undefined ]


在一些不支持這些方法的遊覽器中我們是如何實現這些方法呢
首先要處理的問題是在迭代過程中如何過濾掉缺少元素,用
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;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章