1,遍历数组的方法
ES5, 有forEach, map, filter, some, every, reduce, reduceRight等等,只是返回的结果不一样
用forEach遍历数组,使用break不能中断循环,使用return也不能返回到外层函数
2, for in遍历数组的毛病
- index索引为字符串型数字,不能直接进行几何运算
- 遍历顺序有可能不是按照实际数组的内部顺序\
- 使用for in会遍历数组所有的可枚举属性,包括原型,所以for in更适合遍历对象,不要使用for in遍历数组
for in遍历的是数组的索引(即键名),而 for of遍历的是数组元素值
Object.prototype.method = function () {
console.log(this);
}
var myObject = {
a: 1,
b: 2,
c: 3
}
for (var key in myObject) {
console.log(key);// a b c method
}
for in 可以遍历到myObject的原型方法method,如果不想遍历原型方法和属性的话,可以在循环内部判断一下,hasOwnPropery方法可以判断某属性是否是该对象的实例属性
for (var key in myObject) {
if(myObject.hasOwnProperty(key)){
console.log(key);
}
}
- for..of适用遍历数/数组对象/字符串/map/set等拥有迭代器对象的集合.但是不能遍历对象,因为没有迭代器对象.与forEach()不同的是,它可以正确响应break、continue和return语句
- for-of循环不支持普通对象,但如果你想迭代一个对象的属性,你可以用for-in循环(这也是它的本职工作)或内建的Object.keys()方法:
for (var key of Object.keys(someObject)) {
console.log(key + ": " + someObject[key]);
}
- 遍历map对象时适合用解构,例如;
for (var [key, value] of phoneBookMap) {
console.log(key + "'s phone number is: " + value);
}
3, 循环
// 普通的循环
var arr = [1,2,0,3,9];
for ( var i = 0; i <arr.length; i++){
console.log(arr[i]);
}
// 优化版循环, 使用变量,将长度缓存起来,避免重复获取长度,数组很大时优化效果明显
for(var j = 0,len = arr.length; j < len; j++){
console.log(arr[j]);
}
// forEach, 不能使用break语句中断循环,也不能使用return语句返回到外层函数
// 没有返回值,forEach()的执行速度 < map()的执行速度
arr.forEach(function(value,i){\
console.log('forEach遍历:'+i+'--'+value);
})
// map即是 “映射”的意思 用法与 forEach 相似,同样不能使用break语句中断循环,也不能使用return语句返回到外层函数,有返回值,可以return出来
arr.map(function(value,index){
console.log('map遍历:'+index+'--'+value);
})
// map遍历支持使用return语句,支持return返回值,返回一个新数组
var temp=arr.map(function(val,index){
console.log(val);
return val*val
})
console.log(temp);