Symbol.toStringTag

Baseline 已广泛支持

该特性已非常成熟,可在多种设备和浏览器版本上使用。自 2017 年 4 月以来,它已在各大浏览器上可用。

Symbol.toStringTag 静态数据属性代表 知名 Symbol Symbol.toStringTagObject.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()

js
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] 并可以被字符串化。对于像 MathJSON 这样的非构造函数对象,该属性作为静态属性安装,以便命名空间对象本身可以被字符串化。有时,构造函数也提供自己的 toString 方法(例如,Intl.Locale),在这种情况下,[Symbol.toStringTag] 属性仅在您显式调用 Object.prototype.toString 时使用。

js
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”标签

js
class ValidatorClass {}

Object.prototype.toString.call(new ValidatorClass()); // "[object Object]"

现在,借助 toStringTag,您可以设置自己的自定义标签

js
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 属性

js
const test = document.createElement("button");
test.toString(); // "[object HTMLButtonElement]"
test[Symbol.toStringTag]; // "HTMLButtonElement"

规范

规范
ECMAScript® 2026 语言规范
# sec-symbol.tostringtag

浏览器兼容性

另见