一、实现一个遍历数组或对象里所有成员的迭代器。
var each = function(obj, fn){
//+++++++++++答题区域+++++++++++
//+++++++++++答题结束+++++++++++
};
try{
var data1 = [4,5,6,7,8,9,10,11,12];
var data2 = {
"a": 4,
"b": 5,
"c": 6
};
console.group(data1);
each(data1, function(o){
if( 6 == this )
return true;
else if( 8 == this )
return false;
console.log(o + ": \"" + this + "\"");
});
console.groupEnd();
/*------[执行结果]------
1: "4"
2: "5"
4: "7"
------------------*/
console.group(data2);
each(data2, function(v, n){
if( 5 == this )
return true;
console.log(n + ": \"" + v + "\"");
});
console.groupEnd();
/*------[执行结果]------
a: "4"
c: "6"
------------------*/
}catch(e){
console.error("执行出错,错误信息: " + e);
}
【思路分析】
1.首先判断传进来的是数组还是对象,用到instanceof,typeof和instanceof都可以用来判断js变量类型,用法区别
typeof(obj) //typeof会返回一个基本数据类型
obj instanceof Array //instanceof一般是用来验证一个对象是否属于某类
注:typeof遇到null,数组,对象都会返回object类型
var each = function(obj, fn){
if(obj instanceof Array){
}
else if(obj instanceof Object){
}
};
2.遍历数组和遍历对象的区别
遍历数组:
for(var i=0,j=array.length;i<j;i++){
alert(array[i]);
}
遍历对象:
for(var e in data){
alert(data[e]);
}
3.分析结果
each(data1, function(o){
if( 6 == this )
return true; //表示跳过并继续遍历
else if( 8 == this )
return false; //表示停止遍历
console.log(o + ": \"" + this + "\"");
});
如果直接for循环,那会输出数组所有元素,现在有个each函数,应该让他指向obj中的元素(即改变this指向,让this代表obj[i])
fn.call(obj[i],i+1); //fn是each的第二个参数,让这个函数指向obj中的元素,第一个参数o,让让它传值i+1
仅仅这样会输出4,5,7,8,9,10,11,12,所以还需要限定让它等于8的时候跳出整个循环
if(obj instanceof Array){
for(var i=0,j=obj.length;i<j;i++){
var temp=fn.call(obj[i],i+1);
if(temp===false){ //===值和类型都要等,==只是值相同null==false
return;
}
}
}
同理,遍历对象
else if(obj instanceof Object){
for(var e in obj){
fn.call(obj[e],obj[e],e); //第一个参数v(对象值),第二个n(对象索引)
}
}
注:obj instanceof Object要在obj instanceof Array之后,因为数组属于对象,Object在前面的话,后面的判断就不执行了