• Array、Object、Map、Set的遍历


    Array、Object、Map、Set的遍历一直记得不太清楚,为了方便查找,做一个总结

    一.Array

    1.for

    1 for(let i = 0; i < arr.length; i++){
    2   ...
    3 }

    2.for in

    i表示数组的索引

    1 for(let i in arr) {
    2     ...
    3 }

    3.for of

    可以正确响应break、continue和return语句

    1 for(let i of arr) {
    2     ...
    3 }

    4.forEcah

    遍历数组中的每一项,没有返回值,对原数组没有影响,不支持IE

    1 arr.forEach(function(item,index,arr){
    2     ...
    3 }

    二.Object

    1.for in

    for in 循环是最基础的遍历对象的方式,它还会得到对象原型链上的属性

     1 // 创建一个对象并指定其原型,bar 为原型上的属性
     2 const obj = Object.create({
     3   bar: 'bar'
     4 })
     5 
     6 // foo 为对象自身的属性
     7 obj.foo = 'foo'
     8 
     9 for (let key in obj) {
    10   console.log(obj[key]) // foo, bar
    11 }

    可以看到对象原型上的属性也被循环出来了

    在这种情况下可以使用对象的 hasOwnProperty() 方法过滤掉原型链上的属性

    1 for (let key in obj) {
    2   if (obj.hasOwnProperty(key)) {
    3     console.log(obj[key]) // foo
    4   }
    5 }

    这时候原型上的 bar 属性就被过滤掉了

    2.Object.keys

    Object.keys() 是 ES5 新增的一个对象方法,该方法返回对象自身属性名组成的数组,它会自动过滤掉原型链上的属性,然后可以通过数组的 forEach() 方法来遍历

    1 Object.keys(obj).forEach((key) => {
    2   console.log(obj[key]) // foo
    3 })

    另外还有 Object.values() 方法和 Object.entries() 方法,这两方法的作用范围和 Object.keys() 方法类似

    注意:for in 循环和 object.keys() 方法都不会返回对象的不可枚举属性

    如果需要遍历不可枚举的属性,需要用Object.getOwnPropertyNames()

    3.Object.getOwnPropertyNames()

    Object.getOwnPropertyNames() 也是 ES5 新增的一个对象方法,该方法返回对象自身属性名组成的数组,包括不可枚举的属性,也可以通过数组的 forEach 方法来遍历

     1 // 创建一个对象并指定其原型,bar 为原型上的属性
     2 // baz 为对象自身的属性并且不可枚举
     3 const obj = Object.create({
     4   bar: 'bar'
     5 }, {
     6   baz: {
     7     value: 'baz',
     8     enumerable: false
     9   }
    10 })
    11 
    12 obj.foo = 'foo'
    13 
    14 // 不包括不可枚举的 baz 属性
    15 Object.keys(obj).forEach((key) => {
    16   console.log(obj[key]) // foo
    17 })
    18 
    19 // 包括不可枚举的 baz 属性
    20 Object.getOwnPropertyNames(obj).forEach((key) => {
    21   console.log(obj[key]) // baz, foo
    22 })

    ES2015 新增了 Symbol 数据类型,该类型可以作为对象的键,针对该类型 ES2015 同样新增了 Object.getOwnPropertySymbols() 方法

    4.Object.getOwnPropertySymbols

    Object.getOwnPropertySymbols() 方法返回对象自身的 Symbol 属性组成的数组,不包括字符串属性

    1 Object.getOwnPropertySymbols(obj).forEach((key) => {
    2   console.log(obj[key])
    3 })

    什么都没有,因为该对象还没有 Symbol 属性

     1 // 给对象添加一个不可枚举的 Symbol 属性
     2 Object.defineProperties(obj, {
     3   [Symbol('baz')]: {
     4     value: 'Symbol baz',
     5     enumerable: false
     6   }
     7 })
     8 
     9 // 给对象添加一个可枚举的 Symbol 属性
    10 obj[Symbol('foo')] = 'Symbol foo'
    11 
    12 Object.getOwnPropertySymbols(obj).forEach((key) => {
    13   console.log(obj[key]) // Symbol baz, Symbol foo
    14 })

    5.Reflect.ownKeys

    Reflect.ownKeys() 方法是 ES2015 新增的静态方法,该方法返回对象自身所有属性名组成的数组,包括不可枚举的属性和 Symbol 属性

    1 Reflect.ownKeys(obj).forEach((key) => {
    2   console.log(obj[key]) // baz, foo, Symbol baz, Symbol foo
    3 })

    对比

    方式基本属性原型链不可枚举Symbol
    for in
    Object.keys()
    Object.getOwnPropertyNames()
    Object.getOwnPropertySymbols()
    Reflect.ownKeys()

    结论

    这其中只有 for in 循环会得到对象原型链上的属性,其它方法都只适用于对象自身的属性

    ES 语言后续添加的新特性不会对以前的代码产生副作用,比如在 ES2015 之前就存在的 for in 循环,Object.keys() 和 Object.getOwnPropertyNames() 是肯定不会返回 Symbol 属性的

    三.Map、Set

    1.for of

    Array可以采用下标进行循环遍历,Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了iterable类型,Array、Map、Set都属于iterable类型。

    具有iterable类型的集合可以通过新的for ... of循环来遍历。

     1 var a = ['A', 'B', 'C'];
     2 var s = new Set(['A', 'B', 'C']);
     3 var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
     4 for (var x of a) { // 遍历Array
     5     alert(x);
     6 }
     7 for (var x of s) { // 遍历Set
     8     alert(x);
     9 }
    10 for (var x of m) { // 遍历Map
    11     alert(x[0] + '=' + x[1]);
    12 }

    2.forEach

    forEach是iterable内置的方法,它接收一个函数,每次迭代就自动回调该函数。

    1 var a = ['A', 'B', 'C'];
    2 a.forEach(function (element, index, array) {
    3     // element: 指向当前元素的值
    4     // index: 指向当前索引
    5     // array: 指向Array对象本身
    6     alert(element);
    7 });

    Set与Array类似,但Set没有索引,因此回调函数的前两个参数都是元素本身:

    1 var s = new Set(['A', 'B', 'C']);
    2 s.forEach(function (element, sameElement, set) {
    3     alert(element);
    4 });

    Map的回调函数参数依次为valuekeymap本身:

    1 var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
    2 m.forEach(function (value, key, map) {
    3     alert(value);
    4 });
  • 相关阅读:
    【ABAP系列】SAP LSMW(摘自官网)
    【ABAP系列】SAP ABAP POPUP弹出框自建内容
    【ABAP系列】SAP ABAP ALV中的TOP_OF_PAGE添加任意图标
    彻底关闭Windows Defender丨Win10
    word中怎样设置页码包含总页数
    10款流行的Markdown编辑器,总有一款适合你
    MyEclipse安装插件
    Eclipse集成SonarLint
    MyEclipse中阿里JAVA代码规范插件(P3C)的安装及使用
    详述 IntelliJ IDEA 插件的安装及使用方法
  • 原文地址:https://www.cnblogs.com/BigFatStar/p/13463679.html
Copyright © 2020-2023  润新知