如何解决for_in循环无法遍历symbol键名的问题
Jade 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
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
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
2
3
4
5
现在,就把 other 过滤掉了
See More
除了 for...in ,还有 for...of / Object.keys() / Object.getOwnPropertyNames() 不能遍历到 Symbol 定义的属性,JSON.stringify 也不会返回