最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 循环、遍历、迭代 知识储备

    正文概述 掘金(Des bisous)   2021-01-22   518

    循环、遍历、迭代

    for in 主要是针对对象进行遍历的,比如:objectarray,typeof [] 为 object,一种特殊的对象,不能对 new Map()new Set() 进行遍历。

    可以看 MDN 的描述:

    1. for...in 语句以任意顺序遍历一个对象的除 Symbol 以外的可枚举属性。
    2. for...in 不应该用于迭代一个关注索引顺序的 Array。
    3. 如果你只要考虑对象本身的属性,而不是它的原型,那么使用 hasOwnProperty() 来确定某属性是否是对象本身的属性

    除了 for in 还有一个类似的 循环方法 for of,它主要用于在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环。

    for of 是依赖于迭代器,而这个迭代器就是 Symbol.iterator,那哪一些类型具备这个迭代器能够使用 for of 呢?

    Array.prototype[@@iterator]() // 包括 arguments
    TypedArray.prototype[@@iterator]()
    String.prototype[@@iterator]()
    Map.prototype[@@iterator]()
    Set.prototype[@@iterator]()
    

    注意:Object 不具备 Symbol.iterator 迭代器

    Symbol.iterator 的属性特性:

    1. writable: false
    2. configurable: false
    3. enumerable: false

    for of 和 for in 的差别

    for in:

    1. 遍历是无序的
    2. 针对于 Object,Array 也可用,Map 和 Set 不可用
    3. 遍历可枚举的属性,包含原型上的属性,可以使用 hasOwnProperty 处理自身属性
    4. 遍历得到的 item 是键名

    for of:

    1. 遍历是有序的
    2. 针对于存在迭代器(Symbol.iterator)的类型,比如:Array、TypedArray、String、Map、Set
    3. 不可遍历与 Object,因为它没有迭代器
    4. 遍历得到的 item 是键值

    自定义迭代器

    // 自定义迭代器,Symbol.iterator
    // 对于 Object 是没有内置迭代器 Symbol.iterator 的,所以无法使用 for of 去迭代,因为 for of 依赖于迭代器 Symbol.iterator
    
    // 先看一下遍历迭代器的流程是怎么样的
    
    // ----------- 迭代器流程 Start -----------
    
    const iterator = function* generator(arr) {
      let index = 0;
      while (index < arr.length) {
        yield arr[index++];   
      }
    }
    
    // 开始迭代
    const _iterator = iterator([1, 2, 3]); // 执行迭代器,得到 generator 对象,包含 next 方法
    
    console.log(_iterator.next()); // {value: 1, done: false}
    console.log(_iterator.next()); // {value: 2, done: false}
    console.log(_iterator.next()); // {value: 3, done: false}
    console.log(_iterator.next()); // {value: undefined, done: true} // 判断为 done 为 true,不在执行
    
    // 以上就是一个迭代过程,像 for of 迭代的时候,内部就是调用 next,如果 done 为 true 就不在输出 value,并且停止调用 next
    
    // ----------- 迭代器流程 End -----------
    
    // ES6 方式自定义迭代器
    Object.prototype[Symbol.iterator] = function* () {
      let index = 0;
      while (index < this.length) {
        yield this[index++];   
      }
    };
    
    // ES6以前方式自定义迭代器
    Object.prototype[Symbol.iterator] = function () {
      let index = 0;
      const _this = this;
      return {
        next() {
          return index < _this.length ? { value: _this[index++], done: false } : {value: undefined, done: true}
        }
      }
    };
    
    const obj = {
      0: 1,
      1: 2,
      2: 3,
      length: 3
    }
    
    for (let val of obj) {
      console.log(val);
    }
    
    // 输出: 1 2 3
    
    // for of 的内部就是先调用 Object.prototype[Symbol.iterator] 得到迭代器对象,
    // 然后根据 done 是否为 true,如果不是则不断去 next,知道 done 为 true 则停止迭代
    
    // 这里有一点,使用 generator 的时候为什么 while 的条件不直接为 while(true){} 不断循环让迭代去 next 内,
    // 首先要知道,迭代的时候是根据返回的 done 为 true 才停止的,那对于 generator 函数,
    // 什么时候才返回 done 为 true 呢,那就是没有 yield 预等待输出的时候,如果设置为 while(true){},
    // 那么 done 永远都为 false,for of 迭代的时候,将不会停止。
    

    起源地下载网 » 循环、遍历、迭代 知识储备

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元