【ES6】Symbol笔记

39 阅读1分钟

1、引入Symbol原因

由于ES5中的对象属性名都是由字符串组成,容易造成属性名冲突。原始数据类型Symbol表示独一无二。通过Symbol()函数创建。使得对象属性有字符串类型和Symbol类型。

    let s = Symbol()
    console.log(typeof(s));//symbol

2、格式:Symbol(“描述”)

如果设置两个Symbol()对象,描述一样或为空,二者也是不一样的。

    let s1=Symbol()
    let s2=Symbol()
    console.log(s1===s2);//false
    let s3=Symbol("s")
    let s4=Symbol("s")
    console.log(s3===s4);//false

3、Symbol不能与其他类型值进行运算,可以转为Boolean值和字符串,但是不能转为数值

(1)Symbol进行运算会报错

    let s=Symbol("symbol")
    console.log("this is "+s);
    //Uncaught TypeError: can't convert symbol to string
    

(2)Symbol值可以显示为字符串

    let s=Symbol("symbol")
    console.log(String(s));//Symbol(symbol)
    console.log(s.toString());//Symbol(symbol)

(3)Symbol值可以转为Boolean值

    let s=Symbol("true")
    console.log(Boolean(s));//true
    console.log(!Boolean(s));//false

(4)Symbol值不能转为数值

    let s=Symbol("1")
    console.log(Number(s));
    //Uncaught TypeError: can't convert symbol to number

4、获取属性描述

    let s= Symbol("My is Symbol")
    console.log(s.description);//My is Symbol

5、Symbol的属性遍历

(1)Object.getOwnPropertySymbols()

    let obj={}
    let a=Symbol("a")
    let b=Symbol("b")
    obj[a]="A"
    obj[b]="B"
    console.log(Object.getOwnPropertySymbols(obj));
    //Array [ Symbol("a"), Symbol("b") ]

(2)Reflect.ownKeys()

    let obj={}
    let a=Symbol("a")
    let b=Symbol("b")
    obj[a]="A"
    obj[b]="B"
    console.log(Reflect.ownKeys(obj));
    //Array [ Symbol("a"), Symbol("b") ]