JS 对象的遍历


定义一个对象,对象的键包含所有数据类型

const SymbolKey = Symbol('a')
const dict = {
  [66]: 66,
  "string": 'string',
  [true]: true,
  [undefined]: undefined,
  [null]: null,
  [BigInt(123)]: BigInt(123),
  [function () { console.log("hello") }]: 'function value',
  [{}]: 'object value',
  [[]]: 'array value',
  [SymbolKey]: 'symbol value',
  __proto__: Object.prototype,
}

使用常规循环循环方法

for (let key in dict) {
  console.log("key:", key, " value:", dict[key])
}

Object.keys(dict).forEach(key => {
  console.log("key:", key, " value:", dict[key])
});

Object.entries(dict).forEach(([key, value]) => {
  console.log("key:", key, " value:", value);
});

Object.getOwnPropertyNames(dict).forEach(key => {
  console.log("key:", key, " value:", dict[key])
});

打印结果:

key: 66  value: 66
key: 123  value: 123n
key: string  value: string
key: true  value: true
key: undefined  value: symbol value
key: null  value: null
key: function () { console.log("hello") }  value: function value
key: [object Object]  value: object value
key:   value: array value

可以看出除了对象的原型对象和Symbol其他数据类型都可以打印出来

// 获取Symbol
const symbolKey = Object.getOwnPropertySymbols(dict)
console.log(symbolKey, dict[symbolKey[0]]);
// 获取 __proto__
const protoKey = Object.getPrototypeOf(dict)
console.log(protoKey, dict.__proto__);

打印结果:

[ Symbol(a) ] symbol value
[Object: null prototype] {} [Object: null prototype] {}

遍历对象全部属性:

// 遍历对象可枚举和不可枚举属性

const getObjectKeys = (obj) => {
  let keys = Object.keys(obj)
  const symbolKeys = Object.getOwnPropertySymbols(dict)
  keys.push(...symbolKeys)
  const protoKey = Object.getPrototypeOf(dict)
  keys.push(protoKey)
  return keys
}
console.log(getObjectKeys(dict));

打印结果:

[
  '66',
  '123',
  'string',
  'true',
  'undefined',
  'null',
  'function () { console.log("hello") }',
  '[object Object]',
  '',
  Symbol(a),
  [Object: null prototype] {}
]

posted @ 2024-07-21 16:14  Aguest  阅读(35)  评论(0)    收藏  举报