for/of、Object.entries()

本文最后更新于:2 小时前

for/of、Object.entries()

for/of

for/of循环专门用于可迭代对象。现在只要知道数组、字符串、集合和映射都是可迭代的就行了。它们都是一组或一批元素,可以使用for/of循环来循环或迭代这些元素。

1
2
3
4
5
let data=[1,2,3,4,5,6,7,8,9],sum=0
for(let i of data){
sum += i
}
sum // 45

在上面的代码中,循环体对应data数组中的每个元素都会运行一次。在每次执行循环体之前,都会把数组的下一个元素赋值给元素变量。数组元素是按照从头到尾的顺序迭代的。

数组迭代是“实时”的,即迭代过程中的变化可能影响迭代的输出。如果修改前面的代码,在循环内添加一行data.push(sum),则会创建一个无穷循环。因为迭代永远不会触及数组的最后一个元素。

1
2
3
4
5
6
let data=[1,2,3,4,5,6,7,8,9],sum=0
for(let i of data){
sum += i
// data.push(sum) 千万不要这样
}
sum // 45

for/of与对象

Object.keys()、Object.values()

对象(默认)是不可迭代的。运行时尝试对常规对象使用for/of会抛出TypeError

1
2
3
4
let o={x:1,y:2,z:3}
for(let i of o){
console.log(i) //Uncaught TypeError: o is not iterable
}

如果想迭代对象的属性,可以使用for/in循环,或者基于Object.keys()方法的结果使用for/of

1
2
3
4
5
6
let o={x:1,y:2,z:3}
let keys=''
for(let i of Object.keys(o)){
keys+=i
}
keys //'xyz'

这是因为Object.keys()返回一个对象属性名的数组,而数组是可以通过for/of来迭代的。也要注意,这种对象的键的迭代并不像上面例子那样是实时的,在循环体内修改对象o不会影响迭代。
如果你不在乎对象的键,也可以像下面这样**迭代每个键对应的值 **

1
2
3
4
5
6
let o={x:1,y:2,z:3}
let sum=0
for(let i of Object.values(o)){
sum+=i
}
sum //6

如果你既想要对象属性的键,也想要属性的值,可以基于Object.entries()解构赋值来使用for/of

1
2
3
4
5
6
let o={x:1,y:2,z:3}
let data=''
for(let [i,j] of Object.entries(o)){
data +=i+j
}
data //'x1y2z3'

Object.entries()返回一个数组的数组,其中每个内部数组表示对象的一个属性的键/值对。这里使用解构赋值把这些内部数组拆开,并将它们的元素赋值给两个变量