Learning Note - Symbol.toStringTag

1,196 阅读1分钟

查阅Lodash源码时翻阅到baseGetTag.js了解到Symbol.toStringTag,记录下来以供以后查阅。

Symbol.toStringTag是对象的一个属性,用于标记该对象的自定义类型标签。

什么是Symbol.toStringTag

Symbol.toStringTag是一个内置symbol,它通常作为对象的属性键使用,对应的属性值应该为字符串类型,这个字符串用来表示该对象的自定义类型,通常只有内置的Object.prototype.toString()方法采取读取这个标签并把它包含在自己的返回值里。

很多内置对象没有toStringTag属性,但也能被toString()方法识别,如String,Array,Number,Boolean,undefined,null

另一些对象能被toString()识别是因为引擎为它们设置好了toStringTag,如Map,GeneratorFunction,Promise

摘自MDN

简单来说,代码如下

const str = '123';
Object.prototype.toString.call(str);    // "[object String]"
str[Symbol.toStringTag]    // undefined

const map = new Map();
Object.prototype.toString.call(map);    // "[object Map]"
map[Symbol.toStringTag]    // "Map"

如何使用

通常我们判断一个对象的类型,需要使用instanceof关键字

instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置

class Car {
    constructor(model, year) {
        this.model = model;
        this.year = year;
    }
}

const smart = new Car('Benz', '2018');

smart instanceof Car // true
Object.prototype.toString.call(smart) // "[object Object]"

// 我们希望toStirng()方法能直接返回"[object Car]",那么可以使用Symbol.toStringTag
class Car {
    constructor(model, year) {
        this.model = model;
        this.year = year;
    }
    get [Symbol.toStringTag]() {
        return "Car";
    }
}

const smart = new Car('Benz', '2018');

smart instanceof Car // true
Object.prototype.toString.call(smart) // "[object Car]"