对象和数组的遍历

数组遍历

1.一般for轮回

代码以下

for(var i=0;i<arr.length;i++)
{
    //do something here
}

注:有待优化的空间

2.优化for轮回

for(var i=0,len=arr.length;i<len;i++){
    //do something here
}

注:将长度缓存起来,防止反复猎取,基本是机能最高的一种数组遍历要领。(在遍历长度较多的数组时,才会显现上风)

3. forEach轮回

arr.forEach(function(el){
    //do something here
})

注:数组自带的要领

4. for in 要领

var arr=[2,3,4]
for(var item in arr){
    console.log(item)// 0,1,2
}

注:效力很低.该要领猎取的是键名。应用于array时,为下标index,应用到对象时,为key。下文提到的for of轮回猎取到的是键值。

5. map要领

arr.map(function(item){
    //do something here
})

注:体式格局文雅,效力很低,还不如forEach

6. for of 轮回(ES6)

for(var item of arr){
 // do something here
}

注:是ES6所支撑的要领,通常具有iterator接口的数据接口,都可以运用for of遍历他的成员。其内部的完成要领是挪用数据结构的Symbol.iterator 要领。for of轮回的运用范围包括:数组,Set,Map,类数组对象(如arguments对象,DOM Nodelist对象等),Generator对象,以及字符串等

对象的属性遍历

关于对象的遍历,主如果指其属性的遍历。以下总结6种要领来遍历对象的属性

1. for in

for in轮回遍历对象本身可继续的 可罗列属性(不包括Symbol属性)

2. Object.keys(obj)

该要领返回一个数组,包括对象本身的(不包括继续的)一切可罗列的属性(不包括Symbol属性)

注:大多数情况下,我们只体贴对象本身的属性,引入继续的属性会让题目 复杂化。所以只管不要用for in轮回而运用Object.keys()替代

3. Object.getOwnPropertyNames(obj)

包括对象本身的一切属性(不包括Symbol属性,然则包括不可罗列的属性)

4. Object.getOwnPropertySymbols(obj)

返回一个数组,包括对象本身的一切Sybmol属性。

5. Reflect.ownKeys(obj)

返回一个数组,包括对象本身的一切属性,不论属性名是不是是Symbol或字符串,也不论是不是是可罗列的

6. Reflect.enumerate(obj)

与for in轮回雷同

扩大浏览:属性的可罗列性

形貌

对象的每一个属性都有一个形貌对象(Descriptor),用于形貌该属性的行动。

猎取要领

经由过程Object.getOwnPropertyDescriptor要领可以猎取该属性的形貌对象

var a={A:1}
Object.getOwnPropertyDescriptor(a,"A");
//{
//    configurable:true,
//    enumerable:true,可罗列性,true
//    value:1,
//    writable:true
//}

引入目标

当改属性为false时,标示某些操纵会疏忽这个属性:

  1. for in 轮回

  2. Object.keys()

  3. JSON.stringify()

  4. Object.assign()

  5. Reflect.enumerate()

实际上,引入改属性的目标,就是为了让某些属机可以躲避掉for in轮回
别的,ES6种划定,一切Class原型上的要领都是不可罗列的。

参考文献:
阮一峰:《ES6规范入门》

    原文作者:neove
    原文地址: https://segmentfault.com/a/1190000008178221
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞