Symbol(js的第七种数据类型)
概述
ES5 的对象属性名都是字符串,这容易造成属性名的冲突。⽐如,你使⽤了⼀个他⼈提供的对象,但⼜想为这个对象添加新的⽅法(mixin 模式),新⽅法的名字就有可能与现有⽅法产⽣冲突。如果有⼀种机制,保证每个属性的名字都是独⼀⽆⼆的就好了,这样就从根本上防⽌属性名的冲突。这就是 ES6 引⼊Symbol的原因。
ES6 引⼊了⼀种新的原始数据类型Symbol,表⽰独⼀⽆⼆的值。它是 JavaScript 语⾔的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
Symbol 值通过Symbol函数⽣成。这就是说,对象的属性名现在可以有两种类型,⼀种是原来就有的字符串,另⼀种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独⼀⽆⼆的,可以保证不会与其他属性名产⽣冲突。
let s = Symbol();
typeof s
// "symbol"
上⾯代码中,变量s就是⼀个独⼀⽆⼆的值。typeof运算符的结果,表明变量s是 Symbol 数据类型,⽽不是字符串之类的其他类型。
注意,Symbol函数前不能使⽤new命令,否则会报错。这是因为⽣成的 Symbol 是⼀个原始类型的值,不是对象。也就是说,由于 Symbol 值不是对象,所以不能添加属性。基本上,它是⼀种类似于字符串的数据类型。
Symbol函数可以接受⼀个字符串作为参数,表⽰对 Symbol 实例的描述,主要是为了在控制台显⽰,或者转为字符串时,⽐较容易区分。
let s1 = Symbol('foo');
let s2 = Symbol('bar');
s1 // Symbol(foo)
s2 // Symbol(bar)
上⾯代码中,s1和s2是两个 Symbol 值。如果不加参数,它们在控制台的输出都是Symbol(),不利于区分。有了参数以后,就等于为它们加上了描述,输出的时候就能够分清,到底是哪⼀个值。
如果 Symbol 的参数是⼀个对象,就会调⽤该对象的toString⽅法,将其转为字符串,然后才⽣成⼀个 Symbol 值。
const obj = {
toString() {
return 'abc';js的基本数据类型
}
};
const sym = Symbol(obj);
sym // Symbol(abc)
注意,Symbol函数的参数只是表⽰对当前 Symbol 值的描述,因此相同参数的Symbol函数的返回值是不相等的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。