Symbol符号详解

67 阅读1分钟

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