for-in/of 对象遍历的区别

Object 遍历的方法

  1. for ... in  用于对象或基础的可访问属性的遍历,适合处理对象

      a:    for-in 取key并且会返回字符串类型,不管key是否为字符串

      b:    遍历数字键,也会遍历非数字键或其他属性

      c:    返回key在迭代中不保证返回的顺序,不如 for-of

      

      in 不是像 of 那样有迭代器属性,但是可以访问可枚举的属性.  在对象可见的属性都会被遍历.

     

  1.   ES6 借鉴 C++、Java、C# 和 Python 语言,引入了for...of循环,作为遍历所有数据结构的统一的方法。

      一个数据结构只要部署了Symbol.iterator属性,就被视为具有 iterator 接口,就可以用for...of循            环,for...of循环内部调用的是数据结构的Symbol.iterator方法。

      for of 读取键值(适合处理数组,for in 读取键名.

      a:    直接取值简洁高效

      b:    比forEach不同,可以使用continue  break   *return(只可以在函数中使用). forEach在return中无效--

      c:    被认为是遍历大部分数据结果的统一操作接口

     

      类数组  可以用 for-of 处理

      String                   字符串

      DOM NodeList      节点列表

      arguments            函数参数

      set                       Set

      map                     Map

      使用  for-of 处理对象  需要先进行预处理

      entries() 转为迭代器对象 用of访问,返回值带有index

      Object.prototype.toString.call( arr.entries())

      //   "[object Array Iterator]"  类型名称特殊

      keys() 先获取一个key的数组,基于数组进行对象遍历

  •  *   特殊处理,使用生成器将迭代器或者数组循环中的值,分步返回,在用循环迭代,迭代器方式返回key。

       function* entries(obj) {

            for (let key of Object.keys(obj)) {

                 yield [key, obj[key]];

            }

       }

      

  1. Object.keys(obj),返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol属性).

      和 for in 方式遍历的结果一致

  1. Object.getOwnPropertyNames(obj),返回一个数组,包含对象自身的所有属性
  1. Object.getOwnPropertySymbols(obj),返回一个数组,包含对象自身的所有Symbol属性.

      

  1. Reflect.ownKeys(obj),返回一个数组,包含对象自身的所有属性,不管属性名是Symbol或字符串,也不管是否可枚举.

猜你喜欢

转载自www.cnblogs.com/the-last/p/11434870.html