Symbol 类型

4.Symbol 类型

4.1 定义

ES6 中引入了一个新的原始数据类型Symbol类型,它表示独一无二的值。

最大用途用来定义私有对象的私有成员。

ES6 数据类型除了 Number 、 String 、 Boolean 、 Object、 null 和 undefined ,还新增了 Symbol 。

它是一个基本类型的值,不能使用new关键字来创建。

补充:=====的区别,详细请参考https://www.runoob.com/note/12388

const name1 = Symbol('name');
const name2 = Symbol('name');
console.log(name1===name2);// 虽然两个值相同的类型,相同的值,但是内存地址时不同的。
>>> false

4.2 使用场景

说明:一般使用较少,通常用来定义私有成员。由于 每一个Symbol的值都是不相等的,所以Symbol作为对象的属性(),可以保证属性不重复。

  • 写法一

    let s1 = Symbol('s1');
    let obj = {};
    obj[s1] = 'mm';
    console.log(s1) // 输出的值唯一
    >>> Symbol(s1)
    console.log(obj) //{Symbol(s1): 'mm'}
    
  • 写法二

    let s1 = Symbol('s1');
    
    let obj2 = {
        [s1]:'jj'// 需要使用中括号进行包裹
    }
    console.log(obj2);//
    >>> {Symbol(s1): 'jj'}
    
  • 写法三

    let s1 = Symbol('s1');
    let obj3 = {} 
    Object.defineProperty(obj3,s1,{
        value:'mjj'
    })// 类似与通过反射为对象进行赋值的操作。
    console.log(obj3);//
    console.log(obj3[s1]);//mjj
    console.log(obj3.s1);//undefined
    >>> {Symbol(s1): 'mjj'}
    
  • Symbol 作为对象属性名时不能用.运算符,要用方括号。因为.运算符后面是字符串,所以取到的是字符串 s1 属性,而不是 Symbol 值 s1 属性

4.3 注意点

获取相关的键的时候需要使用对应的方法进行操作

let s1 = Symbol('s1');
let obj3 = {}
Object.defineProperty(obj3,s1,{
    value:'mjj'
})
for (let key in obj3){
    console.log(key);// 无输出
}
console.log(Object.keys(obj3)); //[]
let s = Object.getOwnPropertySymbols(obj3);
console.log(s);// [Symbol(s1)]

let m = Reflect.ownKeys(obj3);
console.log(m);// [Symbol(s1)]
posted @ 2022-08-06 15:11  紫青宝剑  阅读(162)  评论(0编辑  收藏  举报