Symbol符号详解
Symbol.toStringTag
案例:判断是否是async函数
function isAsyncFunction (func) {
return func[Symbol.toStringTag] === 'AsyncFunction'
}
注意:使用“async函数返回一个Promise”这个特征来解决问题是不合理的,因为你不知道这个函数的参数是什么
案例:判断一个对象是否是某个类的实例
class A {}
A.prototype[Symbol.toStringTag] = 'A'
let a = new A()
console.log(Object.prototype.toString.call(a)) // 'A'
在es6之前,Object.prototype.toString.call()方法只使用于一些内置对象,比如判断一个变量是否是数组
暂时不知道Object.prototype.toString.call()和instanceOf的区别
总结 当你的需求是判断某个实例是否是某个类的实例时,可是用这个方法,函数也可以看个某个实例(对象)。
Symbol.toPrimitive
- 当代理对象需要进行原始类型转换时,需要定义该属性
- 该属性值是一个函数
const add = new Proxy({
_sum: 0
}, {
get (target, p, receiver) {
if (p === Symbol.toPrimitive) {
return () => {
return target._sum
}
}
target._sum += +p
return receiver
}
})
console.log(add[1][2][4] + 3) // 10