es6新类型之Symbol学习笔记(一)


Symbol

  • Symbol()函数返回一个类型符号的值,具有暴露内置对象的几个成员的静态属性,具有公开全局符号注册表的静态方法,并且类似于内置对象类,但作为构造函数不完整,因为 它不支持“new Symbol()”语法。
  • 从Symbol()返回的每个符号值都是唯一的。 符号值可以用作对象属性的标识符; 这是数据类型的唯一目的。 关于目的和用法的进一步解释可以在Symbol的词汇表中找到。
  • symbol 是原始数据类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// JavaScript Demo: Symbol - Constructor
const symbol1 = Symbol();
const symbol2 = Symbol(42);
const symbol3 = Symbol('foo');

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

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

console.log(Symbol('foo') === Symbol('foo'));
// expected output: false

语法

1
2
Symbol([description])

参数

description 可选

  • 可选,字符串。 描述可用于调试但不访问符号本身的符号。

说明

  • 要创建一个新的原始符号,可以使用可选字符串作为其描述来编写Symbol()
1
2
3
4
var sym1 = Symbol();
var sym2 = Symbol('foo');
var sym3 = Symbol('foo');

  • 上面的代码创建了三个新的符号。 请注意,Symbol(“foo”)不会将字符串“foo”强制转换为符号。 它每次都会创建一个新符号:
1
2
Symbol('foo') === Symbol('foo'); // false

  • 新运算符的以下语法将引发TypeError:
1
2
var sym = new Symbol(); // TypeError

  • 这可以防止作者创建一个显式的Symbol包装器对象而不是新的符号值,并且可能会令人惊讶,因为通常可以在原始数据类型周围创建显式包装器对象(例如,new Boolean,new String和New Number)。
  • 如果你真的想创建一个Symbol包装器对象,你可以使用Object()函数:
1
2
3
4
5
var sym = Symbol('foo');
typeof sym; // "symbol"
var symObj = Object(sym);
typeof symObj; // "object"