跳到主要内容

遍历对象

一、规则


  • 首先遍历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接口的数据结构为: ArrayMapSetStringTypedArray函数的 arguments 对象NodeList 对象

**对象(Object)**没有默认Iterator接口,因为对象属性遍历顺序不确定

详情请见

参考资料


JavaScript 设计模式(五):迭代器模式