数据类型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)