javascript增加Array的each方法 循環遍歷多維數組


 

由於ECMA提供遍歷數組的方法forEach()只能遍歷一維數組,沒有提供循環遍歷多維數組的方法,所以我們自己來實現一個each()方法,來遍歷多維數組。

<script charset=utf-8 type=text/javascript>

 

/*var arr = [1,2,3,[4,[5]]];

arr.forEach(function(item,index,arr){

alert(item);

});

*/

//模擬ECMA forEach  循環遍歷多維數組

 

var arr = [1,2,3,[4,[5,[6,[7]]]]];

 

//使用原型,可以擴展對象的屬性和方法

Array.prototype.each = function (fn){

try{

//計數器

this.i || (this.i=0);

//判斷數組的長度必須大於0 && 傳進來的必須是一個函數  才進行循環遍歷操作

if(this.length > 0 && fn.constructor == Function){

while(this.i < this.length){

//獲取數組的每一項

var e = this[this.i];

//如果取到了數組的每一項 && 該項仍為數組 則進行遞歸操作

if(e && e.constructor == Array){

e.each(fn);

}else{

//如果取到了數組的每一項 && 該項不為數組 則執行fn函數  打印出數組的每一項

fn.call(e,e);//不懂    (看下面講解或者見鏈接)             http://www.cnblogs.com/snandy/archive/2012/03/01/2373243.html

}

//使i遞增

this.i++;

}

//最后把i置為空,垃圾回收機制 回收

this.i = null;

}

}catch(ex){

 

}

//返回當前對象

return this;

}

//forEach()方法 的參數是一個函數  並且函數內有參數,這里我們就把函數內的參數設為一個

arr.each(function(item){

alert(item);

});

</script>

call和apply的第一個參數是null/undefined時函數內的的this指向window或global

call/apply用來改變函數的執行上下文(this),它們的第一個參數thisArg是個對象,即作為函數內的this。

多數時候你傳啥函數內就是啥。僅以call示例

1
2
3
4
5
6
7
function  fun() {
     alert( this );
}
fun.call(1);
fun.call( 'a' );
fun.call( true );
fun.call({name: 'jack' });

 

分別彈出“1”、“a”、“true”、“[object Object]”。

有兩種情況需要注意,傳null或undefined時,將是JS執行環境的全局變量。瀏覽器中是window,其它環境(如node)則是global。

1
2
fun.call( null );  // window or global
fun.call(undefined);  // window or global

這在ECMAScript5.1 15.3.4.4中有解釋,如下

 

嚴格模式下情況又有所不同,ES3比較寬容盡量去揣測代碼意圖。ES5嚴格模式(ie6/7/8/9除外)則不再揣測,給call/apply傳入的任何參數不再轉換。如下

1
2
3
4
5
6
'use strict'
function  fun() {
     alert( this );
}
fun.call( null )       // null
fun.call(undefined)  // undefined

 

須注意!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM