Javascript之for(in/of)、forEach用法的理解

开门见山,许多小伙伴对 for 语句应该再熟悉不过了,无论是前端遍历渲染还是 js 中的逻辑处理。但是要把 for 语句写得优雅,写得高效,理解它的用法就比较重要了。

目录

一、for (语句 1; 语句2; 语句3)

语句 1

语句 2

语句 3

二、for in 循环

三、for of 循环

四、forEach 循环


一、for (语句 1; 语句2; 语句3)

我们最常见的就是 for 语句了

for (语句 1; 语句2; 语句3)
{
    被执行的代码块
}

语句1 (代码块)开始前执行
语句2 定义运行循环(代码块)的条件
语句3 在循环(代码块)已被执行之后执行

for (var i = 0; i < x.length; i++) {
    //do something...
}

语句 1

通常我们会使用语句 1 初始化循环中所用的变量 (var i = 0)。

语句 1 是可选的,也就是说不使用语句 1 也可以。

您可以在语句 1 中初始化任意(或者多个)值:

for (var i = 0, len = x.length; i < len; i++)
{ 
    document.write(x[i] + "<br>");
}

省略语句 1,在循环开始前已经对 i 进行初始化赋值

var i = 1, len = x.length;
for (; i < len; i++) { 
    document.write(x[i] + "<br>");
}

语句 2

通常语句 2 用于评估初始变量的条件。

语句 2 同样是可选的。

如果语句 2 返回 true,则循环再次开始,如果返回 false,则循环将结束。

PS:如果你省略了语句2,就必须要使用 break 进行跳出,否则循环将无法停止,导致 browser 崩溃。

语句 3

通常语句 3 会增加初始变量的值。

语句 3 也是可选的。

语句 3 有多种用法。增量可以是负数 (i--),或者更大 (i=i+n)。

语句 3 也可以省略(比如当循环内部有相应的代码时):

var i = 0, len = x.length;
for (; i < len;) { 
    document.write(cars[i] + "<br>");
    i++;
}

二、for in 循环

1、for in 语句将循环遍历对象的属性

var car = {
    brand: "BMW",
    type: "SUV",
    model: "X7"
}
var res = ""
for (x in car) {
    res = res+ car[x]
}
//结果res="BMWSUVX7"

2、使用 for in 去遍历数组,得到的 x 就是数组的索引 index。

const car = [{ name: 'BMW' }, { name: 'AUDI' }]
for (let x in car) {
  console.log(key)
}
//结果:
// 0
// 1

PS:for in 循环中可以使用 break 和 continue 进行中断,如循环体在函数中才可使用 return 来跳出,不建议与数组一起使用(会遍历原型链上的属性 method 和 name,且 for in 的 key 是 String 类型,有转换过程,开销比较大

三、for of 循环

1、for of 是ES6的新特性,从而也是为了解决 for in 在处理数组时的不足。

2、for in 输出的是数组的 index 下标,而 for of 输出的是数组的每一项的值。

const arr = [1,2,3,4]
 
// for in
for (const key in arr){
    console.log(key) // 输出 0,1,2,3
}
 
// for of
for (const key of arr){
    console.log(key) // 输出 1,2,3,4
}

3、对于普通对象,没有部署原生的 iterator 接口,直接使用 for of 会报错,不过可以遍历带有iterator接口的,例如Set,Map,String,Array

var obj = {
   'name': 'KK',
   'age': 9
}
 
for(let key of obj) {
   console.log('for of obj', key)
}
// Uncaught TypeError: obj is not iterable

四、forEach 循环

1、语法如下:

array.forEach(function(currentValue, index, arr), thisValue)

forEach 更多的用来遍历数组、集合,forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数,总返回undefined

var arr = [1,2,3,4];   
arr.forEach(alert); 
 
//等价于: 
var arr = [1, 2, 3, 4];
for (var k = 0, length = arr.length; k < length; k++) {
  alert(array[k]);
}

PS:forEach 对于空数组是不会执行回调函数的。清切在遍历跑完回调函数后,会隐性让index自增。

2、forEach() 本身是不支持的 continue 与 break 语句,我们可以通过 return 和 every 来实现。

2.1、使用 return 语句实现 continue 关键字的效果:

let arr = [1, 2, 3, 5, 9]
arr.forEach(item => {
  if (item % 2 === 0) {
    return
  }
  console.log('item', item)
})
/*
  item 1
  item 3
  item 5
  item 9
  undefined
*/

2.2、break 实现

var arr = [1, 2, 3, 4, 5]

arr.every(function (item) {
    console.log(item);
    return item !== 3;
})
/*
  1
  2
  3
  false
*/

3、forEach只支持同步代码,所以不能使用 await

最后欢迎各位补充及指正,其实知识和注意点还有很多~~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值