如何解决for_in循环无法遍历symbol键名的问题

4/2/2020 ES6JavaScript

# 解决方案

# getOwnPropertySymbols

Object.getOwnPropertySymbols() 只会返回对象中 Symbol 类型的属性名

const obj = {
  name:"Jade",
  nation:"China",
  [Symbol('address')]: 'XXX'
}

const objectSymbols = Object.getOwnPropertySymbols(obj) // [Symbol('address')]
1
2
3
4
5
6
7

# Reflect.ownKeys

Reflect.ownKeys() 方法会返回所有类型的属性名,包括常规属性名和 Symbol 属性名

Reflect.ownKeys(obj) // ["name", "nation", Symbol(foo)]
1

# 解析

for...in 循环对象会访问原型链上所有对象属性

const obj = {
  name:"Jade",
  nation:"China",
  [Symbol('address')]: 'XXX'
}
const objNames = []
Object.prototype.other = 'other'

for(let key in obj) {
  objNames.push(key) // ["name", "nation", "other"]
}
1
2
3
4
5
6
7
8
9
10
11

这里原型链上的 other 属性也被遍历出来了

那么,想要至遍历指定对象中的自有属性,这是就需要借助 hasOwnProperty() 方法,该方法传入属性名,检测对象自身是否具有指定的属性名,有则返回 true,否则返回 false

for(let key in obj) {
  if(obj.hasOwnProperty(key)) {
    objNames.push(key) // ["name", "nation"]
  }
}
1
2
3
4
5

现在,就把 other 过滤掉了

See More

除了 for...in ,还有 for...of / Object.keys() / Object.getOwnPropertyNames() 不能遍历到 Symbol 定义的属性,JSON.stringify 也不会返回

Last Updated: 5/31/2023, 6:25:55 PM