J S 循 环 大 总 结

169 阅读2分钟

for循环

for循环属于命令式编程。
优点:程序员可以自由的控制循环的开始和结束,可玩性更高。
缺点:书写较为繁琐。

forEach循环

Array的forEach、map等等循环属于函数式编程。
优点:使用方便,代码更易阅读,方便维护。
缺点:无法精确管理过程,性能上也有所消耗。
plus:forEach底层实现就是对for循环的封装。

for in 循环

for in 循环一般用来遍历对象的属性。
for in 循环的性能很差。
特点:可以遍历到非Symbol类型、可枚举的以及继承的属性。遍历时以数字类型优先。
例如:

    const obj = {
      name: '小猪佩奇',
      age: '3岁',
      [Symbol('secret')]: '秘密',
      2: '2',
      1: '1'
    }
    Object.prototype.mySelf = 'Object新增属性'
    for (key in obj) {
      console.log(obj[key])
    }
    console.log('-----------------------')
    for (key in obj) {
      console.log(key)
    }

运行结果:
image.png

for in 中只遍历自身属性的解决方案:使用Object.prototype.hasOwnProperty(key) 判断该属性是非是自己的属性,不是就break。

for of 循环

for of 循环是基于迭代器规范的循环,只能遍历实现了iterator接口的数据类型的遍历。
Array以及es6中新增的Set、Map都实现了该接口。故可以直接使用for of 循环。 常见的引用数据类型对象(Object)没有实现iterator接口,不能使用for of 循环,我们可以手动实现该接口来根据自己的需求自定义迭代规则。
例如:

    Object.prototype[Symbol.iterator] = function () {
      let _self = this
      let index = 0
      let keys = Reflect.ownKeys(_self)
      return {
        next() {
          if (index < keys.length) {
            return { value: _self[keys[index++]], done: false }
          }
          return { value: undefined, done: true }
        }
      }
    }
    const obj = {
      name: '小猪佩奇',
      age: '3岁',
      [Symbol('secret')]: '秘密',
      2: '2',
      1: '1'
    }
    Object.prototype.mySelf = 'Object新增属性'
    for (item of obj) {
      console.log(item)
    }

运行结果:

image.png

小结

js中循环的使用方式多种多样,在实际开发中在对应的场景下使用合适的循环,有利于提高代码质量,方便项目的维护。