查阅
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]"