ES6 对象的扩展 - enumerable

66 阅读1分钟

属性的可枚举属性:

对象的每一个属性都具有一个描述对象 Descriptor, 用于控制该属性的行为

Object.getOwnPropertyDescriptor 可以获取!

//  {
//    value: 123,
//    writable: true,
//    enumerable: true,
//    configurable: true
//  }

enumerable 可枚举属性

如果是false 表示不可枚举,某些操作会忽略当前属性

  1. ES5 有三个操作会忽略
    • for in:遍历 对象自身+继承 可枚举的属性
    • Object.keys(): 返回 对象自身 可枚举属性 的键名
    • JSON.stringify() :只串行化 对象自身的 可枚举属性
  2. ES6 会忽略不可枚举属性的方法
    • Object.assign(): 只复制 对象自身 可枚举属性

对象的length 和toString() 的enumerable 是false ,因为for in 不会遍历到这两个

ES6 规定: 所有Class的原型 的方法 都是不可枚举的,也就是都是false

尽量不要使用for in 可以使用 Object.keys() 代替

ES6 一共有5种方法可以遍历 对象的属性:

  1. for..in :
    1. 【自身 + 继承】 可枚举属性 不含symbol属性
  2. Object.keys(obj): 返回一个数组
    1. 自身 可枚举属性 不含symbol属性
  3. Object.getOwnPropertyName(obj):返回一个数组
    1. 自身所有属性(包括不可枚举属性)不含symbol属性
  4. Object.getOenPropertySymbols(obj): 返回一个数组
    1. 自身所有的symbol属性
  5. Reflect.ownKeys(obj): 返回一个数组
    1. 自身所有属性

先遍历数字排序,然后是字符串的生成时间,然后是生成时间的symbol