js的循环

79 阅读1分钟

js中三类循环对比及性能分析?

稀疏数组:数组里有item为空,相对应的密集数组里每一项item都有值不为空。稀疏数组不能使用我们数组的某一些方法比如forEach,map等

for循环及forEach底层原理

  • for循环是自己控制循环过程
  • 基于Var声明时,for和while性能差不多(不确定次数的情况下使用while)
  • 基于let声明时,for循环性能更好,(原理:没有创造全局不释放的变量)
  • 重写forEach

for in循环的bug以及解决方案

  • 迭代所有可枚举属性(私有&公有),按照原型链一级级查找很耗费性能,性能非常差,史上最垃圾的循环方式。(私有属性大部分是可枚举的,但length除外,公有属性(出现在所属类的原型上的)也有部分是可枚举的。查找机制上一定会找到原型链上去
  • 问题很多:不能迭代Symbol属性、迭代顺序会以数组属性优先、公有可枚举的(一般是自定义属性)属性也会进行迭代(遍历顺序以数字优先)

for of循环的底层机制

  • 迭代器iterator规范(具备next方法,每次执行返回一个对象,具备value/done属性)
  • 让对象具备可迭代性并且使用for of循环

iterator迭代器 部分数据结构实现了迭代器规范

Symbol.iterator,哪些结构实现了迭代器规范呢,比如有数组/部分类数组(比如arguments)/Set/Map(对象没有实现)

for of循环的原理是按照迭代器规范遍历的,不能遍历对象