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