Symbol的理解和使用

Symbol的诞生,也就是Symbol存在的意义

之前我们的对象属性的数据类型都是字符串,没有其他的,所以会导致属性名的重复,导致属性值被覆盖的情况。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法,在添加的操作就很容易覆盖原有的方法。所以需要一个独一无二的数据类型来完成这个使命。所以Symbol出来支持大局

Symbol的介绍

1.唯一性

Symbol这个英文单词表示‘唯一’,没错它是javascript的第七中数据类型,表示它是唯一的。
创建一个Symbol类型是不需要new操作符。否则会报错。因为生成Symbol是一个原始类型的值,不是对象。直接let s = Symbol()

 let s = Symbol('a')
        let ss = Symbol('a')
        console.log(s == 's');
        //false

通哟上面例子的比较,我们对Symbol的唯一性,有了一定的了解,也就是当你创建了一个Symbol数据后,那么你就是独一无二的存在。

数据类型的修饰

有人会好奇Symbol(‘a’)里面的参数a又是怎么回事,字符串a表示一种修饰,对你当前创建Symbol类型的一种修饰,作为区分使用,否则当你创建多个Symbol数据时,容易混淆

与其他数据类型之前的转化

Symbol不能用四则运算进行操作,否则会报错,它只能用显示的方式转为字符串和布尔值,即:

String(Symbol())/Boolean(Symbol())
作为对象属性
作为对象的属性时,注意以下三种方式来书写

第一种写法

let mySymbol = Symbol()
let a = {}
a[mySymbol] = 'Hello'

第二在写法

let mySymbol = Symbol()
let a = {
 [mySymbol]: 'Hello'
}

第三种写法

let mySymbol = Symbol()
let a = {}
Object.defineProperty(a,mySymbol,{value: 'Hello'})

以上打印a[mySymbol]都是Hello

对象属性的遍历

以上说了对象属性的创建,但是我们要格外的注意,Symbol作为属性名,该属性不会出现在for…in,for…of循环中,也不会被Object.keys(),Object.getOwnPropertyNames(),JSON.stringify()返回。所以我们可以用Object.getOwnPropertySymbols方法,获取指定对象的所有Symbol属性名
如果一个对象里面有字符串属性又有Symbol的属性,那必须要适应新API方法:Reflect.ownKeys(),这个方法就可以返回对象所有的属性,也就是字符串属性和Symbol属性。

let person = {
            name: '小明',
            age: 12,
            [Symbol('level')] : 'A'
        }
        console.log(Object.keys(person));
         /*
        0: "name"
        1: "age"
        */
        console.log(Object.getOwnPropertySymbols(person));
        /*
        0: "name"
        1: "age"
        */
        console.log(Reflect.ownKeys(person));
        /*
        0: "name"
        1: "age"
        2: Symbol(level)
        */

你可能感兴趣的:(javascript,前端)