Javascript对象遍历方式

概念:我们都知道js内部实际上与python,java等的继承方式不同,js是通过原型和原型链的方式实现继承
image

那么有一个很关键的问题,如果我们想要得到某个对象的属性,我们应该怎么做??

要解决这个问题,有两个方面要解决,一是明确需求,即所需属性是否在原型链上;二是属性类型是什么

根据以上两个方面,可以将js对象属性分为四类:1.自身属性;2.原型链上的属性;3.可枚举属性;4.特殊属性

因此,有四种对应的遍历方式

方法 自身属性 原型链 可枚举 Symbol
for...in true true true false
Object.keys() true false false false
Object.getOwnPropertyNames() true false true & false false
Object.getOwnPropertySymbols() true false N/A true
Reflect.ownKeys() true false true true

1.for...in

会遍历原型,所以要搭配Object.prototype.hasOwnProperty()使用
const ownResult = []; for(let key in obj){ if(Object.prototype.hasOwnProperty.call(obj,key)){ ownResult.push(key); } }

2.Object.keys

只遍历自身的可枚举的字符串属性,不会遍历原型链,也忽略了Symbol属性

3.Object.getOwnPropertyNames()

遍历对象自身的所有字符串属性,无论是否可枚举

4.Object.getOwnPropertySymbols()

返回自身所有的Symbol属性

5.Reflect.ownKeys()

最完整的自身属性列表,自身所有属性,包括Symbol都能看见,但是不属于自身的,看不见
Proxy经常结合Reflect搭配应用在元编程和代理拦截当中

6.遍历顺序

1.字符串键:证书(保证数组)升序,其他字符串键(插入顺序或者初始化顺序)
2.Symbol

总结:以上有多种对象属性遍历方式可以供我们选择,但是在选择时还应该注意性能问题,选择合理的方式达成效果,比如Object.keys通常快于for...in+hasOwnProperty
遍历方式越全面,那么性能开销一般越大

posted @ 2025-11-01 09:57  闭光潜逃的阿甘  阅读(4)  评论(0)    收藏  举报