代码以下数组
for(var i=0;i<arr.length;i++) { //do something here }
注:有待优化的空间缓存
for(var i=0,len=arr.length;i<len;i++){ //do something here }
注:将长度缓存起来,避免重复获取,基本是性能最高的一种数组遍历方法。(在遍历长度较多的数组时,才会显示优点)数据结构
arr.forEach(function(el){ //do something here })
注:数组自带的方法性能
var arr=[2,3,4] for(var item in arr){ console.log(item)// 0,1,2 }
注:效率很低.该方法获取的是键名。应用于array时,为下标index,应用到对象时,为key。下文提到的for of循环获取到的是键值。优化
arr.map(function(item){ //do something here })
注:方式优雅,效率很低,还不如forEachcode
for(var item of arr){ // do something here }
注:是ES6所支持的方法,凡是具备iterator接口的数据接口,均可以使用for of遍历他的成员。其内部的实现方法是调用数据结构的Symbol.iterator 方法。for of循环的使用范围包括:数组,Set,Map,类数组对象(如arguments对象,DOM Nodelist对象等),Generator对象,以及字符串等对象
关于对象的遍历,主要是指其属性的遍历。如下总结6种方法来遍历对象的属性继承
for in循环遍历对象自身 和 可继承的 可枚举属性(不包含Symbol属性)接口
该方法返回一个数组,包含对象自身的(不包含继承的)全部可枚举的属性(不包含Symbol属性)ip
注:大多数状况下,咱们只关心对象自身的属性,引入继承的属性会让问题 复杂化。因此尽可能不要用for in循环而使用Object.keys()代替
包含对象自身的全部属性(不包含Symbol属性,可是包含不可枚举的属性)
返回一个数组,包含对象自身的全部Sybmol属性。
返回一个数组,包含对象自身的全部属性,无论属性名是不是Symbol或字符串,也无论是不是可枚举的
与for in循环相同
描述
对象的每一个属性都有一个描述对象(Descriptor),用于描述该属性的行为。
获取方法
经过Object.getOwnPropertyDescriptor方法能够获取该属性的描述对象
var a={A:1} Object.getOwnPropertyDescriptor(a,"A"); //{ // configurable:true, // enumerable:true,可枚举性,true // value:1, // writable:true //}
引入目的
当改属性为false时,标示某些操做会忽略这个属性:
for in 循环
Object.keys()
JSON.stringify()
Object.assign()
Reflect.enumerate()
实际上,引入改属性的目的,就是为了让某些属性可以规避掉for in循环
另外,ES6种规定,全部Class原型上的方法都是不可枚举的。
参考文献:阮一峰:《ES6标准入门》