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