遍历对象
一、规则
-
首先遍历
Number
类型,按照key从小到大排序 -
其次遍历
String
类型,按照属性被创建的时间升序排序。 -
最后遍历
Symbol
,逻辑同String
相同
二、方案
2.1 for……in
for...in
循环遍历对象自身的和继承的可枚举属性(不含Symbol
)
语法
const obj = {
name: "哈哈",
age: 23,
};
Object.setPrototypeOf(obj, { like: "娃哈哈" });
for(const item in obj){
console.log(item); // name age like
}
特点
-
for……in
遍历只可以获取键名,不可以获取键值 -
for in
的循环性能循环很差。性能差的原因是因为:for in
会迭代对象原型链上一切可以枚举的属性。
2.2 Object.keys()
Object.keys
返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含Symbol
属性)的键名
2.3 Object.getOwnPropertyNames()
Object.getOwnPropertyNames
返回一个数组,包含自身所有属性(不含Symbol
属性,但是包括自身不可枚举属性)的键名
2.4 Object.getOwnPropertySymbols()
Object.getOwnPropertySymbols
返回一个数组,包含自身对象所有Symbol
的熟悉键名
2.5 Reflect.ownKeys()
Reflect.ownKeys
返回一个数组,包含对象自身所有键名,不管键名是Symbol
或字符串,也不管是否可枚举
三、问题
3.1 为什么对象不可以使用 for……of 遍历?
for……of
的运行原理为:
-
首先调用遍历对象
[Symobo.iterator]()
方法,拿到遍历器对象 -
每次循环,调用遍历器对象
next()
方法,得到{value: ..., done: ... }
对象
原生具备 Iterator
接口的数据结构为: Array
、Map
、Set
、String
、TypedArray
、函数的 arguments 对象
、NodeList 对象
**对象(Object)**没有默认Iterator
接口,因为对象属性遍历顺序不确定