Symbol.toStringTag
Symbol.toStringTag 静态数据属性代表 知名 Symbol Symbol.toStringTag。 Object.prototype.toString() 在 this 值上查找此属性,以获取一个表示对象类型的字符串。
试一试
class ValidatorClass {
get [Symbol.toStringTag]() {
return "Validator";
}
}
console.log(Object.prototype.toString.call(new ValidatorClass()));
// Expected output: "[object Validator]"
值
知名 Symbol Symbol.toStringTag。
Symbol.toStringTag 的属性特性 | |
|---|---|
| 可写 | 否 |
| 可枚举 | 否 |
| 可配置 | 否 |
示例
默认标签
某些值没有 Symbol.toStringTag,但有特殊的 toString() 表示。有关完整列表,请参阅 Object.prototype.toString()。
Object.prototype.toString.call("foo"); // "[object String]"
Object.prototype.toString.call([1, 2]); // "[object Array]"
Object.prototype.toString.call(3); // "[object Number]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call(null); // "[object Null]"
// … and more
内置 toStringTag Symbol
大多数内置对象都提供了自己的 [Symbol.toStringTag] 属性。几乎所有内置对象的 [Symbol.toStringTag] 属性都是不可写的、不可枚举的且可配置的;例外情况是 Iterator,出于兼容性原因,它是可写的。
对于像 Promise 这样的构造函数对象,该属性安装在 Constructor.prototype 上,以便构造函数的所有实例都继承 [Symbol.toStringTag] 并可以被字符串化。对于像 Math 和 JSON 这样的非构造函数对象,该属性作为静态属性安装,以便命名空间对象本身可以被字符串化。有时,构造函数也提供自己的 toString 方法(例如,Intl.Locale),在这种情况下,[Symbol.toStringTag] 属性仅在您显式调用 Object.prototype.toString 时使用。
Object.prototype.toString.call(new Map()); // "[object Map]"
Object.prototype.toString.call(function* () {}); // "[object GeneratorFunction]"
Object.prototype.toString.call(Promise.resolve()); // "[object Promise]"
// … and more
使用 toStringTag 自定义标签
创建自己的类时,JavaScript 默认使用“Object”标签
class ValidatorClass {}
Object.prototype.toString.call(new ValidatorClass()); // "[object Object]"
现在,借助 toStringTag,您可以设置自己的自定义标签
class ValidatorClass {
get [Symbol.toStringTag]() {
return "Validator";
}
}
Object.prototype.toString.call(new ValidatorClass()); // "[object Validator]"
toStringTag 在所有 DOM prototype 对象上可用
由于 2020 年中期 WebIDL 规范的更改,浏览器正在为所有 DOM prototype 对象添加 Symbol.toStringTag 属性。例如,要访问 HTMLButtonElement 上的 Symbol.toStringTag 属性
const test = document.createElement("button");
test.toString(); // "[object HTMLButtonElement]"
test[Symbol.toStringTag]; // "HTMLButtonElement"
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-symbol.tostringtag |
浏览器兼容性
加载中…