for in 和 for of 相对于你们确定都不陌生,都是用来遍历属性的没错。那么先看下面的一个例子:javascript
const obj = {
a: 1,
b: 2,
c: 3
}
for (let i in obj) {
console.log(i)
// a
// b
// c
}
for (let i of obj) {
console.log(i)
// Uncaught TypeError: obj is not iterable 报错了
}
以上代码经过 for in 和 for of 对一个obj对象进行遍历,for in 正常的获取了对象的 key值,分别打印 a、b、c,而 for of却报错了。html
以上是遍历对象,下面再看一个遍历数组的例子。java
const arr = ['a', 'b', 'c']
// for in 循环
for (let i in arr) {
console.log(i)
// 0
// 1
// 2
}
// for of
for (let i of arr) {
console.log(i)
// a
// b
// c
}
以上代码是对一个数组进行遍历, for in 返回的值为 0、一、2,这不是数组的下标吗? 而 for of 返回的是 a、b、c,这一次没有报错,为何呢?数组
const arr = ['a', 'b']
// 手动给 arr数组添加一个属性
arr.name = 'qiqingfu'
// for in 循环能够遍历出 name 这个键名
for (let i in arr) {
console.log(i)
// a
// b
// name
}
结合上面的两个例子,分析得出:数据结构
for ... in 循环返回的值都是数据结构的 键值名。
遍历对象返回的对象的key值,遍历数组返回的数组的下标(key)。dom
for ... in 循环不只能够遍历数字键名,还会遍历原型上的值和手动添加的其余键。如——例3ui
特别状况下, for ... in 循环会以任意的顺序遍历键名spa
总结一句: for in 循环特别适合遍历对象。
for of 循环用来获取一对键值对中的值,而 for in 获取的是 键名code
一个数据结构只要部署了 Symbol.iterator 属性, 就被视为具备 iterator接口, 就能够使用 for of循环。htm
例1这个对象,没有 Symbol.iterator这个属性,因此使用 for of会报 obj is not iterable
for of 不一样与 forEach, 它能够与 break、continue和return 配合使用,也就是说 for of 循环能够随时退出循环。
提供了遍历全部数据结构的统一接口
只要有 iterator 接口的数据结构,均可以使用 for of循环。
以上这些均可以直接使用 for of 循环。 凡是部署了 iterator 接口的数据结构也均可以使用数组的 扩展运算符(...)、和解构赋值等操做。
我也想让对象能够使用 for of循环怎么办?使用 Object.keys() 获取对象的 key值集合后,再使用 for of
以例1为例
const obj = {
a: 1,
b: 2,
c: 3
}
for (let i of Object.keys(obj)) {
console.log(i)
// 1
// 2
// 3
}
也能够给一个对象部署 Symbol.iterator属性。
来源:https://www.cnblogs.com/qiqingfu/archive/2018/11/28/10035554.html