Symbol() 构造函数

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2015.

Symbol() 构造函数返回一个 symbol 类型的值,但是它并不完全支持构造函数的语法,因为它不支持 new Symbol() 语法,也无法被子类化。它可以作为 class 定义中 extends 子句的值使用,但对它进行 super 调用将会导致异常。

尝试一下

const symbol1 = Symbol();
const symbol2 = Symbol(42);
const symbol3 = Symbol("foo");

console.log(typeof symbol1);
// Expected output: "symbol"

console.log(symbol2 === 42);
// Expected output: false

console.log(symbol3.toString());
// Expected output: "Symbol(foo)"

console.log(Symbol("foo") === Symbol("foo"));
// Expected output: false

语法

js
Symbol()
Symbol(description)

备注: Symbol() 只能在没有 new 的情况下调用,尝试用 new 构造会抛出 TypeError

参数

description 可选

一个字符串,用来表示 symbol 的描述,可以用于调试,但不能直接访问 symbol 自身。

示例

创建 symbol

要创建一个新的原始 symbol,你可以传递一个可选的字符串作为 description 参数来创建 Symbol()

js
const sym1 = Symbol();
const sym2 = Symbol("foo");
const sym3 = Symbol("foo");

上面的代码创建了三个新的 symbol,注意 Symbol("foo") 不会将字符串 "foo" 强制转换成 symbol,而是每次总是创建一个新的 symbol:

js
Symbol("foo") === Symbol("foo"); // false

new Symbol()

下面带有 new 运算符的语法将会抛出一个 TypeError

js
const sym = new Symbol(); // TypeError

这一限制是为了防止开发人员创建一个显式的 Symbol 包装对象,而不是一个新的 symbol 值。这可能会让人感到困扰,因为在通常情况下,可以创建基本数据类型的显式包装对象(例如 new Booleannew Stringnew Number)。

如果你真的想创建一个 Symbol 包装器对象,你可以使用 Object() 函数:

js
const sym = Symbol("foo");
const symObj = Object(sym);
typeof sym; // "symbol"
typeof symObj; // "object"

规范

Specification
ECMAScript® 2025 Language Specification
# sec-symbol-constructor

浏览器兼容性

参见