for in和for of和foreach

forEach

[1, 2, 3, 5, 10].forEach(element => {
    console.log(element)
});

foreach 方法没办法使用 break 语句跳出循环,或者使用return从函数体内返回

for in

var obj = {
    a: 1,
    b: 2
}
var arr = ['嘿嘿','哈哈','啦啦']
var str = 'sdasf'
var words = new Set(['work','play','lang'])

// 遍历对象
for (const key in obj) {
    console.log(key)    // a,b
}
// 遍历数据
for (const key in arr) {
    console.log(key)    // 0,1,2
}
// 遍历字符串
for(const key in str) {
    console.log(key)    // 0,1,2,3,4
}
// 遍历数字
for(const key in 0) {
    console.log(key)    // 啥也没输出
}
// 遍历Set
for(const key in words) {
    console.log(key)    // 啥也没输出
}

由上我们可以看出,for in最适合遍历对象,并且只能输出可枚举属性(包括原型上的可枚举属性)。虽然它也可以遍历数组和字符串,但是它的key是数组下标,这个下标是String类型,不是Number类型。

for in陷阱:

var arr = ['a','b','c']
arr.name = '嘿嘿'
for(const key in arr) {
    console.log(key)    // 0,1,2,name
}
for (const key of arr) {
    console.log(key)    // a,b,c
}

 这个时候会发现for in的弊端,for of可以解决这个问题

for of

var obj = {
    a: 1,
    b: 2
}
var arr = ['嘿嘿','哈哈','啦啦']
var str = 'sdasf'
var words = new Set(['work','play','lang'])

// 遍历对象
for (const key of obj) {
    console.log(key)    // TypeError: obj is not iterable
}
// 遍历数据
for (const key of arr) {
    console.log(key)    // 嘿嘿,哈哈,啦啦
}
// 遍历字符串
for(const key of str) {
    console.log(key)    // s,d,a,s,f
}
// 遍历数字
for(const key of 0) {
    console.log(key)    // TypeError: 0 is not iterable
}
// 遍历Set
for(const key of words) {
    console.log(key)    // work,play,lang
}

1、避免for in陷阱
2、不同于forEach,可以使用break, continue 和 return
3、支持字符串的遍历
4、不能直接遍历对象
5、不仅支持数组的遍历,还支持类数组的遍历

补充:数组可以采用下标循环,但是Map和Set就没法使用下标。为了统一集合的类型,ES6标准引入了一个新iterable类型。Array、Set、Map都属于iterable类型。具有iterable类型的集合可以通过for of来遍历

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值