for ... of
const arr = [1, 2, 3]
for (let item of arr) {
console.log(item)
}
for ... of 作用于一个iterable(可迭代)对象。
哪些是可迭代对象?例如: Array, Map, Set, String等,他们实现了键为 @@iterator 的属性,可以通过Symbol.iterator访问。如下图:

image.png
而普通对象,则不是iterable。
for ... in
以任意顺序遍历一个对象的除[Symbol]以外的[可枚举],包括继承的可枚举属性。
Object.getOwnPropertyNames()
返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组
Object.keys()
返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致