ECMAScript5新增陣列API的一些細節
阿新 • • 發佈:2019-02-10
ECMAScript5新增的陣列方法看似都比較簡單其實還是有一些細節需要了解的
首先這些方法都不會作用於原陣列,其次是在對稀鬆陣列的處理上.
(1)這些方法在稀鬆陣列缺少的元素上都不會執行回撥函式
(2)map的返回值包括稀鬆陣列缺少的元素,而filter方法會過濾掉稀鬆陣列的缺少元素,從而返回的都是一個緊湊的陣列
在一些不支援這些方法的遊覽器中我們是如何實現這些方法呢 首先要處理的問題是在迭代過程中如何過濾掉缺少元素,用 for (var i = 0; i < arr.length; i++)的迴圈方法是行不通的,因為陣列的長度是包括缺失元素的,並且我們不能通過undefined來判斷這是否是一個缺少元素還是故意設定的undefined值,其實想想js陣列的特殊性這個問題還是很好解決的我們直接用for in便可過濾掉缺失的元素 下面給出在不支援這些方法的遊覽器上我們如何自己實現
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;