对象遍历办法总结:

  • for...in:遍历对象本身, 蕴含继承, 可枚举,不含 Symbol 的属性。
  • Object.keys(obj):遍历对象本身, 不含继承,可枚举,不含 Symbol 的属性。【values, entries】
  • Object.getOwnPropertyNames(obj):遍历对象本身, 不含继承, 不含 Symbol 的属性, 不论是否可枚举
  • Object.getOwnPropertySymbols(obj): 遍历对象本身, 不含继承, 所有 Symbol 的属性, 不论是否可枚举
  • Reflect.ownKeys(obj): 遍历对象本身,不含继承,所有键名,不论是否Symbol 和可枚举。

    对象其余办法:

  • JSON.stringify():只串行化对象本身,不含继承,可枚举,不含 Symbol属性。
  • Object.assign(): 只拷贝对象本身,不含继承, 可枚举属性, 不论是否是Symbol
办法本身属性继承属性可枚举属性Symbol属性
for...in..必须
Object.keys()必须
Object.getOwnPropertyNames(obj)非必须
Object.getOwnPropertySymbols(obj)非必须
Reflect.ownKeys(obj)非必须非必须
JSON.stringify()必须
Object.assign()必须非必须
代码验证
  1. 创立父对象protoObject和子对象myObject:
const protoObject = {  show_proto: '我是可枚举 - 父',  [Symbol('symbol_show_proto')]: '我是Symbol,可枚举 -  父',};let myObject = {  show_my: '我是可枚举',  [Symbol('symbol_show_my')]: '我是Symbol,可枚举',};Object.defineProperty(myObject, 'hidden_my', {  value: '我是不可枚举',  enumerable: false,});Object.defineProperty(myObject, Symbol('symbol_hidden_my'), {  value: '我是Symbol,不可枚举',  enumerable: false,});Reflect.setPrototypeOf(myObject, protoObject);

2.查看protoObject和myObject:

3.遍历: