# getSymbols
# Description
拿到 object
的可枚举 symbol
数组
# Params
object
# Return
Array
# Code
const propertyIsEnumerable = Object.prototype.propertyIsEnumerable
const nativeGetSymbols = Object.getOwnPropertySymbols
function getSymbols(object) {
if (object == null) {
return []
}
object = Object(object)
return nativeGetSymbols(object).filter((symbol) => propertyIsEnumerable.call(object, symbol))
}
# Analyze
- 如果传入的 object 为 null ,则直接 返回 空数组
- 调用 Object 构造函数,将 object 包装成一个新的对象
- Object.getOwnPropertySymbols() 方法返回一个给定对象自身的所有 Symbol 属性的数组。
- Object.prototype.propertyIsEnumerable() 方法返回一个布尔值,表示指定的属性是否可枚举。
- 通过以上两个方法,过滤出可以枚举的 symbol 数组,并返回
# Remark
- Object () 构造函数 MDN (opens new window)
- Object.prototype.propertyIsEnumerable() MDN (opens new window)
- Object.getOwnPropertySymbols() MDN (opens new window)
- Object.defineProperty() MDN (opens new window)
# Example
const a = {a: 1}
;[1,2,3,4,5].forEach(k => {
Object.defineProperty(a, Symbol(k), {
'enumerable': true,
'value': k,
})
})
Object.defineProperty(a, Symbol(6), {
'value': 6,
})
console.log(getSymbols(a)) // [ Symbol(1), Symbol(2), Symbol(3), Symbol(4), Symbol(5) ]