1.标准的for循环遍历数组
//不打印自定义属性和继承属性
var array = [1,2,3];
for (var i = 0; i < array.length; i++) {
console.log(array[i]);
}
2.for in 遍历对象
不要用for in遍历数组,因为还会打印自定义属性和继承属性
一般常用来遍历非数组的对象并且使用hasOwnProperty()方法去过滤掉原型链上的属性
数组的key是string类型,因为js中一切皆为对象。
var array = [1,2,3];
//自定义属性
array.desc ='four';
//继承属性 扩展了js原生的Array
Array.prototype.test=function(){}
array.hasOwnProperty('desc') //true
array.hasOwnProperty('test') //false
for(var key in array){
console.log(array[key])
}
3.for of遍历数组
ES6里引入了一种遍历器(Iterator)机制,为不同的数据结构提供统一的访问机制。只要部署了Iterator的数据结构都可以使用 for ··· of ··· 完成遍历操作
它既比传统的for循环简洁,同时弥补了forEach和for-in循环的短板。
循环遍历键值对的value,与for in遍历key相反
//不打印自定义属性和继承属性
for(var value of array){
console.log(value)
}
如果实在想用for…of来遍历普通对象的属性,可以先获取对象的所有key的数组Object.keys(),然后遍历
( Iterator详解 :http://es6.ruanyifeng.com/#docs/iterator )
4.forEach遍历数组 VS map VS $.each
forEach遍历数组,而且在遍历的过程中不能被终止,必须每一个值遍历一遍后才能停下来
//不打印自定义属性和继承属性
array.forEach((value,index,arr)=>{
console.log(value);
});
//注意其与jQuery的$.each类似,只不过第1个和第2个参数正好是相反的
//thisArg为执行回调时的this值
[].forEach(function(value, index, array) { /*...*/ } ,thisArg) //返回值:undefined
[].map(function(value,index,array){ return value*2 }, thisArg) //返回值:返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
$.each([], function(index, value) { /*...*/ }); //$.each遍历数组或者类数组
对于类似数组的结构,可转换为数组
//divList不是数组,而是nodeList
var divList = document.querySelectorAll('div');
[].slice.call(divList)
Array.prototype.slice.call(divList)
[...divList] //ES6写法
总结:
- forEach 遍历数组,而且在遍历的过程中不能被终止,必须每一个值遍历一遍后才能停下来
- for in 以任意顺序遍历对象的可枚举属性,(最好不要用来遍历数组) 因此当迭代那些访问次序重要的 arrays 时用整数索引去进行 for 循环 (或者使用 Array.prototype.forEach() 或 for…of 循环) 。
- (ES6)for…of 允许你遍历 Arrays(数组), Strings(字符串), Maps(映射), Sets(集合)等可迭代的数据结构等。不能遍历普通对象
- for…in 遍历(当前对象及其原型上的)每一个key,而 for…of遍历(当前对象上的)每一个value;