2021.04.28(Symbol、Symbol.prototype.description)

Symbol

ES6 引入了一种新的原始数据类型 Symbol  ,表示独一无二的值。它是 JavaScript 语言的第七
种数据类型,前六种是: undefined  、 null  、布尔值(Boolean)、字符串(String)、数值
(Number)、对象(Object)。

1.  let s = Symbol();
2.
3.  typeof s
4.  // "symbol"

注意, Symbol  函数前不能使用 new  命令,否则会报错。这是因为生成的 Symbol 是一个原始类
型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是一种类
似于字符串的数据类型。

Symbol  函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显
示,或者转为字符串时,比较容易区分。

1.  let s1 = Symbol('foo');
2.  let s2 = Symbol('bar');
3.
4.  s1 // Symbol(foo)
5.  s2 // Symbol(bar)
6.
7.  s1.toString() // "Symbol(foo)"
8.  s2.toString() // "Symbol(bar)"

上面代码中, s1  和 s2  是两个 Symbol 值。如果不加参数,它们在控制台的输出都是 Symbol()  ,不利于区分。有了参数以后,就等于为它们加上了描述,输出的时候就能够分清,到
底是哪一个值。

如果 Symbol 的参数是一个对象,就会调用该对象的 toString  方法,将其转为字符串,然后才生
成一个 Symbol 值。

1.  const obj = {
2.  toString() {
3.  return 'abc';
4.  }
5.  };
6.  const sym = Symbol(obj);
7.  sym // Symbol(abc)

注意, Symbol  函数的参数只是表示对当前 Symbol 值的描述,因此相同参数的 Symbol  函数的
返回值是不相等的。

1.  // 没有参数的情况
2.  let s1 = Symbol();
3.  let s2 = Symbol();
4.
5.  s1 === s2 // false
6.
7.  // 有参数的情况
8.  let s1 = Symbol('foo');
9.  let s2 = Symbol('foo');
10.
11.  s1 === s2 // false

上面代码中, s1  和 s2  都是 Symbol  函数的返回值,而且参数相同,但是它们是不相等的。
Symbol 值不能与其他类型的值进行运算,会报错。

1.  let sym = Symbol('My symbol');
2.
3.  "your symbol is " + sym
4.  // TypeError: can't convert symbol to string
5.  `your symbol is ${sym}`
6.  // TypeError: can't convert symbol to string

但是,Symbol 值可以显式转为字符串。

1.  let sym = Symbol('My symbol');
2.
3.  String(sym) // 'Symbol(My symbol)'
4.  sym.toString() // 'Symbol(My symbol)'

另外,Symbol 值也可以转为布尔值,但是不能转为数值。

1.  let sym = Symbol();
2.  Boolean(sym) // true
3.  !sym // false
4.
5.  if (sym) {
6.  // ...
7.  }
8.
9.  Number(sym) // TypeError
10.  sym + 2 // TypeError

Symbol.prototype.description

创建 Symbol 的时候,可以添加一个描述。

1.  const sym = Symbol('foo');

上面代码中, sym  的描述就是字符串 foo  。
但是,读取这个描述需要将 Symbol 显式转为字符串,即下面的写法。

1.  const sym = Symbol('foo');
2.
3.  String(sym) // "Symbol(foo)"
4.  sym.toString() // "Symbol(foo)"

上面的用法不是很方便。ES2019 提供了一个实例属性 description  ,直接返回 Symbol 的描
述。

1.  const sym = Symbol('foo');
2.
3.  sym.description // "foo"

 

2021-04-28  14:06:21

posted @ 2021-04-28 14:07  铁打的代码流水的bug  阅读(109)  评论(0)    收藏  举报