关于对象的属性遍历方法比较&symbol属性

54 阅读2分钟

对象的属性遍历

自身属性、继承的属性、可枚举属性、不可枚举属性、symbol属性

对象遍历方法对比表:

方法遍历自身属性遍历原型链包含不可枚举包含Symbol返回类型ES版本
for...in部分属性名ES5
Object.keys()属性名数组ES5
Object.getOwnPropertyNames()属性名数组ES5
Reflect.ownKeys()属性名数组ES6
Object.entries()键值对数组ES2017
Object.getOwnPropertySymbols()仅SymbolSymbol数组ES6

对象遍历方法详细对比表:

方法遍历范围特点使用场景代码示例
for...in自身+原型链可枚举属性最早的遍历方法需要遍历继承属性for(let key in obj){ }
Object.keys()自身可枚举属性简单直接快速获取属性名Object.keys(obj)
Object.getOwnPropertyNames()自身所有属性包含不可枚举获取完整属性Object.getOwnPropertyNames(obj)
Reflect.ownKeys()自身所有属性包含Symbol最全面的遍历Reflect.ownKeys(obj)
Object.entries()自身可枚举属性返回键值对转换对象Object.entries(obj)
Object.getOwnPropertySymbols()自身Symbol属性专门获取Symbol处理特殊属性Object.getOwnPropertySymbols(obj)

Symbol 属性详解:

  1. 基本概念
// 创建唯一标识符
let sym1 = Symbol('描述');
let sym2 = Symbol('描述');
console.log(sym1 === sym2); // false
  1. 作为对象属性
let obj = {
  [Symbol('name')]: '张三',
  [Symbol('age')]: 20
};

// 特殊访问方式
console.log(obj[Symbol('name')]); // undefined
  1. 获取 Symbol 属性
// 获取对象的Symbol属性
let symbols = Object.getOwnPropertySymbols(obj);
console.log(symbols); // [Symbol(name), Symbol(age)]
  1. Symbol 特性
// 不可枚举
for (let key in obj) {
  console.log(key); // 空
}

// JSON序列化时被忽略
console.log(JSON.stringify(obj)); // {}
  1. 常见用途
// 私有属性
const _private = Symbol('private');
class Example {
  constructor() {
    this[_private] = '私有数据';
  }
}

// 唯一标识
const ID = Symbol('id');
  1. 全局 Symbol
// 全局Symbol
let globalSym = Symbol.for('key');
let otherSym = Symbol.for('key');
console.log(globalSym === otherSym); // true

关键特点:

  • 唯一性
  • 不可枚举
  • 作为特殊属性使用
  • 避免属性名冲突