数据类型Symbol(JS)
JS数据类型
值类型 (基本类型) :String、Number、Boolean、Null、Undefined、Symbol
引用数据类型 :Object、数组 Array、函数 Function
Symbol
诞生与存在的意义:之前我们的对象属性的数据类型都是字符串,没有其他的,会导致属性名重复,导致属性值被覆盖的情况。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法,在添加的操作就很容易覆盖了原有的方法。所以需要一个独一无二的数据类型来完成这个使命。
介绍
1.唯一性
Symbol这个英文单词表示""唯一",没错它是Javascript的第七种数据类型(其他六种就不列举了),表示它是唯一的。
创建一个Symbol类型不需要用new操作符,否则会报错,因为生成的Symbol是一个原始类型的值,不是对象。直接let s = Symbol;测试s就是Symbol类型了。怎么说他是唯一的呢?
let s = Symbol(); let ss = Symbol(); s == ss; //false
或者
let s = Symbol('a'); let ss = Symbol("a'); s == ss; //false
当你创建了一个Symbol数据后,那么你就是独一无二的存在这样。
2.数据类型的修饰
有人会好奇Symbol('a')里面的参数a又是怎么回事呢?字符串a表示一种修饰,对你当前创建的Symbol类型的一种修饰,作为区分使用,否则当你创建多个Symbol数据时,容易混淆。
3.与其他数据类型之间的转换
Symbol不能用四则运算进行操作,否则报错。它只能用显示的方式转为字符串和布尔值,即:String(Symbol()) / Boolean(Symbol())
4.作为对象的属性
●作为对象的属性时,注意要用以下三种方式来书写:
let mysymbol = symbol();//第一种写法
let a = {};
a [ mysymbol] = "Aloha! ";//第二种写法
let a = {
[mysymbol ]: 'Aloha!'
//第三种写法
};
let a={};
Object.defineProperty(a,mySymbol,{ value: "Aloha!"});
遍历
Symbol作为属性名,该属性不会出现在for ..in、for ..of循环中,也不会被Object.keys()、Object.getOwnPropertyNames()、JSON.stringify()返回。
所以我们可以用Object.getOwnPropertySymbols方法,获取指定对象的所有Symbol属性名。
如果一个对象里面有字符串的属性又有Symbol的属性,难不成要分来获取对象属性吗?答案是不用,那必须使用新的API方法:Reflect.ownKeys(),这个方法就可以返回对象所有的属性,也就是字符串属性和Symbol属性。
Symbol.for()与Symbol.keyFor()
let s1 = Symbol.for ( 'hhh') ;
let s2 =Symbol.for ( 'hhh' ) ;
s1=== s2 // true
// Symbol.keyFor()方法返回一个已登记的Symbol类型值的key。
let s1 =Symbol.for ( "hhh" );
symbol.keyFor(s1)//"hhh"
let s2 =Symbol ( "hhh" );
symbol.keyFor(s2)//undefined
场景下使用
查看代码
var game ={
pg:Symbol('pg'),
sg:Symbol('sg'),
sf:Symbol('sf')
}
function createRole(type) {
if (type === game.pg) {
console.log('控球后卫');
}else if (type === game.sg) {
console.log('得分后卫');
}else if (type === game.sf) {
console.log('小前锋');
}
if ( type === game.sg){
console.log( '得分后卫');
}
}
createRole(game.pg)
createRole(game.sg)