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
语法
参数
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 Boolean
、new String
和 new 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 |