一、for of与for in最明显的区别
-
for...in 遍历得到 key
-
for...of 遍历得到 value
二、for of与for in适用的数据类型
-
遍历对象:for...in可以,for...of 不可以
-
遍历Map Set: for...of 可以,for...in 不可以
for...in可以用在可枚举的数据,如:
-
对象:(对象内的属性有属性描述符,里面配置了enumerable项,默认为true)
-
数组:(数组内每个下标对应的元素都有属性描述符,里面配置了enumerable项,默认为true)
-
字符串:(字符串内每个下标对应的字符都有属性描述符,里面配置了enumerable项,默认为true)
利用Object.getOwnPropertyDescriptors(obj)可获取obj对象内的所有属性的描述符。
for...of用于可迭代的数据,如:
-
数组
-
字符串
-
Map
-
Set
三、遍历对象的方式
- for...in //只遍历对象自身的和原型(继承)上的可枚举的属性(不含 Symbol 属性)
因此用for...in遍历对象自身的属性时:
1、错误用法:
for(let key in obj){
console.log(key) //获取到了自身和原型上的可枚举属性
}
2、正确用法:
利用hasOwnProperty()方法判断自身是否含有这个可枚举属性,过滤掉不在自身的属性 for(let key in obj){
if(obj.hasOwnProperty(key)){
console.log(key) //仅获取到了自身上的可枚举属性
}
}
-
Object.keys() //返回对象自身的所有可枚举的属性的键名(不含 Symbol 属性)
-
Object.getOwnPropertyNames()//返回一个数组,包含对象自身的所有属性,包括不可枚举属性(不含 Symbol 属性)的键名
-
Object.getOwnPropertySymbols()//返回一个数组,包含对象自身的所有 Symbol 属性的键名
-
Reflect.ownKeys()//返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举