symbol 是一种基本数据类型。Symbol()
函数会返回 symbol 类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的 symbol 注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()
"。
每个从 Symbol()
返回的 symbol 值都是唯一的。一个 symbol 值能作为对象属性的标识符;这是该数据类型仅有的目的。
const symbol1 = Symbol();
const symbol2 = Symbol(42);
const symbol3 = Symbol('foo');
console.log(typeof symbol1);
// "symbol"
console.log(symbol2 === 42);
// false
console.log(symbol3.toString());
// "Symbol(foo)"
console.log(Symbol('foo') === Symbol('foo'));
// false
语法
Symbol([description])
参数
description 可选
可选的,字符串类型。对 symbol 的描述,可用于调试但不是访问 symbol 本身。
描述
直接使用Symbol()
创建新的 symbol 类型,并用一个可选的字符串作为其描述。
let sym1 = Symbol();
let sym2 = Symbol("foo");
let sym3 = Symbol("foo");
上面的代码创建了三个新的 symbol 类型。注意,Symbol("foo")
不会强制将字符串“foo”转换成 symbol 类型。它每次都会创建一个新的 symbol 类型:
Symbol("foo") === Symbol("foo");
// false
下面带有 new 运算符的语法将抛出 TypeError 错误 :
let sym = new Symbol();
// TypeError
这会阻止创建一个显式的 Symbol 包装器对象而不是一个 Symbol 值。围绕原始数据类型创建一个显式包装器对象从 ECMAScript 6 开始不再被支持。然而,现有的原始包装器对象,如 new Boolean
、new String
以及new Number
,因为遗留原因仍可被创建。
如果你真的想创建一个 Symbol 包装器对象 (Symbol wrapper object
),你可以使用 Object()
函数:
let sym = Symbol("foo");
typeof sym; // "symbol"
let symObj = Object(sym);
typeof symObj; // "object"
其他方法可参考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol