Symbol数据类型

Symbol学习

在 JavaScript 有6中数据类型,分别是:String字符串类型;Number数字类型;Object对象类型;Boolean布尔值类型;Null空值;Undefined 未定义;

Symbol是ES6给我们带来一种全新的数据类型。Symbol的初衷:解决对象的属性名冲突。

        
         //独一无二数据
         //先定义一个变量
        let s = Symbol();
        console.log(s); //Symbol()
        console.log(typeof s); //判断数据类型为  symbol

我们用一个Symbol( )函数来创建一个symbol类型的变量,我们打印了一下变量sm,得到的结果是控制台输出:Symbol( ),它代表着一个独一无二的值,但是我们看不到它是样子,但基本上,它有点类似字符串。

然后我们再测一下数据类型是否相等

        let s = Symbol(); //独一无二数据
        let s1 = Symbol();
        console.log(s === s1); //false
        console.log(typeof s); //symbol
        console.log(typeof s1); //symbol

定义了两个symbol类型的变量s,s1 用全等符号===(也称严格相等既判断值有判断数据类型)进行比较,得到的是false。也就是说他们都是独一无二的值,并不相等。

我们可以用字符串a1和a2作为参数,然后打印出来的变量a1和a2就是Symbol(a1)和Symbol(a2),等于加上了标记,这样我们容易区分出来。

        let s = Symbol('a1');
        let s1 = Symbol('a2');
        console.log(s); //Symbol(a1)
        console.log(s1); //Symbol(a2)

我们在传参的时候,即使我们传的参是一样但数据类型依然不相等,对应的值还是不一样的,symbol永远都是独一无二的值

        let s = Symbol('a1');
        let s1 = Symbol('a1');
        console.log(s); //Symbol(a1)
        console.log(s1); //Symbol(a1)
        console.log(s === s1); //false

Symbol是为了解决对象属性名冲突的问题,那么我们就结合对象,来学习,看以下代码:

        let s = Symbol(); //声明一个变量
        let obj = {
            id: 1002,
            [s]: "ok"
        }

        console.log(obj); //{id: 2, Symbol(): 'ok'}
        console.log(obj[s]); //ok
        console.log(obj[Symbol()]); //undefined
        console.log(obj.s); //undefined

我们使用中括号的 [ s ] 可以正确获取到里面的值。使用点运算符的形式,会获取失败。因为:当symbol值作为对象的属性名的时候,不能用点运算符获取对应的值,需要加中括号进行获取。

属性名的遍历。当symbol类型的值作为属性名的时候,该属性是不会出现在for...in和for...of中的,也不会被Object.keys( )获取到。看以下代码:

        function Person(age, name, id) {
            this[Symbol()] = age;
            this.name = name;
            this.id = id;
        }
        //new实例对象
        let p = new Person(20, '张强', '423429342342');
        console.log(p); //{name: '张强', id: '423429342342', Symbol(): 20}

        console.log(Object.keys(p)); //['name', 'id']

        for (let key in p) {
            console.log(key); //也只获取到 name id
        }

如果我们就是想要获取symbol类型的属性怎么办?可以使用Object.getOwnPropertySymbols( );方法.  Object.getOwnPropertySymbols( )方法 它会找到symbol类型的属性并且返回一个数组,数组的成员就是symbol类型的属性值,看以下代码:

        function Person(age, name, id) {
            this[Symbol()] = age;
            this.name = name;
            this.id = id;
        }
        //new实例对象
        let p = new Person(20, '张强', '423429342342');
        console.log(p); //{name: '张强', id: '423429342342', Symbol(): 20}
        //获取
        Object.getOwnPropertyDescriptor(p);
        console.log(p); //Person {name: '张强', id: '423429342342', Symbol(): 20}

我们还可以使用Reflect.ownKeys函数  来进行获取,看以下代码:

       //使用Reflect.ownKeys() 方法获取属性名
        function Person(age, name, id) {
            this[Symbol()] = age;
            this.name = name;
            this.id = id;
        }
        //new实例对象
        let p = new Person(20, '张强', '423429342342');
        console.log(p); //{name: '张强', id: '423429342342', Symbol(): 20}

        console.log(Reflect.ownKeys(p)); // ['name', 'id', Symbol()]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值