JavaScript for 循环比较

发布于 2023-05-11 22:07:35 字数 2297 浏览 51 评论 0

for 循环的效率问题比较,建议看一下这篇文章:深入了解 JavaScript 中的 for 循环

判断是否为空对象

// 兼容写法,JavaScript in 操作符可获取对象的属性;delete 操作符则删除属性
function isEmptyObj(obj) {
  for (var i in obj) {
    if (obj.hasOwnProperty(i)) {
      return false
    }
  }
  return true
}

// ES6 写法
function isEmptyObj(obj) {
  return Object.keys(obj).length == 0
}

遍历效率:for > for-of > forEach > filter > map > for-in。虽然 for-in 遍历 Array 元素性能没有普通的 for 循环好,但对于 稀疏数组 的使用是极好的,尤其在数组长度很大的情况,如下:

const arr = []
arr[99] = '哈哈'
arr[999] = '呵呵'
arr[9999] = '滚'

// 优化版 for 循环,只计算一次数组长度(共遍历了 10000 次)
for (let i = 0, len = arr.length; i < len; i++) {
  if (i in { '99': '', '999': '', '9999': '' }) {
    console.log(true + ' ' + i)
  } else {
    console.log(false)
  }
}

// for-in(共遍历了 3 次)
for (const key in arr) {
  if (key in { '99': '', '999': '', '9999': '' }) {
    console.log(arr[key])
  }
}

// 两者遍历次数相差很大,这种情况下采用 for-in 是效率高很多。

循环方式的比较

遍历方式描述缺点
for效率最高改进版 for 循环:使用一个变量存储数组的长度,可以省去每次循环都去计算数组长度
for-ofES6 新增的方法,最简洁、最直接的遍历数组元素的方法,为了改进 forEachfor-in 缺陷而生的新方法。支持数组、对象、字符串、Map 对象、Set 对象遍历不支持遍历普通对象,可以使用 for-in 代替
forEach每执行一遍,都会执行 callback(item, index, array)。其中,item 是当前项,index 是当前索引项,array 是数组对象本身不能 breakcontinue 或者 return
filter用来筛选符合某种条件的元素,将符合条件的元素重新组成一个新的数组 
map面向数组,不改变原数组。对于 未被初始化被删除项(delete 操作符)数组的属性(array.name='小明') 都不会执行 callback 函数 
for-infor-in 是为普通对象设计的,for (var index in arr) { } 赋值给 index 的值不是索引值 12,而是字符串 '1''2'for-in 缺点更加明显,它不仅遍历数组中的元素,还会遍历自定义的属性,甚至原型链上的属性都被访问到。而且,遍历数组元素的顺序可能是随机的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

方圜几里

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

亽野灬性zι浪

文章 0 评论 0

少年亿悲伤

文章 0 评论 0

南七夏

文章 0 评论 0

qq_EJoXxu

文章 0 评论 0

17780639550

文章 0 评论 0

萌逼全场

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文