Symbol解析

Symbol解析

什么是Symbol

ES5中提供了6种数据类型分别是:undefined、null、boolean、string、number、object。ES6中新增了一种数据类型Symbol来表示唯一的值,每个创建的Symbol都是唯一的,这样在实际运用中可以创建一些唯一的属性及定义私有变量。

如何创建Symbol值:

let a = Symbol();
let b = Symbol();
console.log(a);//Symbol()
console.log(b);//Symbol()
console.log(a==b)//false

我们创建了两个Symbol值,打印发现它们都打印出Symbol(),难道他们是相等的吗?那么我们打印他们是否相等发现他们并不是相等的。实际上它在内存中是这样的::
也就是说a变量和b变量拿到了各自的内存引用。

如果不借助a变量,你不可能再得到这个地址。因此:

let a = Symbol();
let b = Symbol();
console.log(a);//Symbol()
console.log(b);//Symbol()
console.log(a==b)//false

let c = b;
console.log(c)//Symbol()
console.log(c==b)//true

在这里插入图片描述

作用

1、为了防止对象属性名被覆盖,可以通过symbol来定义属性名。

const NAME = Symbol('name')
let obj = {
    [NAME]:'张三',
    age: 20
}
export default obj;
import obj from './t2.js';
const NAME = Symbol('name');
obj[NAME] = '李四';
console.log(obj);
//{ age: 20, [Symbol(name)]: '张三', [Symbol(name)]: '李四' }

为了区分,可以写成:

import obj from './t2.js';
const NAME = Symbol('name1');
obj[NAME] = '李四';
console.log(obj); 
//{ age: 20, [Symbol(name)]: '张三', [Symbol(name1)]: '李四' }

2、利用Symbol作为属性名,属性名不会被Object.keys()、Object.getOwnPropertyNames()、for…in循环返回。

let obj = {
    [Symbol()]:'张三',
    age: 20,
    height:'178com'       
}
for(let key in obj){
    console.log(key);
}
//age
//height
let keys = Object.keys(obj);
console.log(keys); //输出:[ 'age', 'height' ]
console.log(Object.getOwnPropertyNames(obj)); //输出:[ 'age', 'height' ]

3、可以在类里利用Symbol来定义私有属性及方法。

let People = (function(){
    let name = Symbol("name");
    class People {
        constructor(yourName) { //构造函数
            this[name] = yourName
        }
        sayName() {
            console.log(this[name])
        }
    }
    return People;
})();
let zhangsan = new People("张三");
console.log(zhangsan[Symbol("name")]); //undefined
zhangsan.sayName(); //张三

4、Symbol.for()
Symbol提供了一种可以创建相同Symbol的机制,就是使用Symbol.for()方法进行注册。通过该方法生成的Symbol会根据描述符进行全局注册,之后再次通过Symbol.for()传入相同的描述符时,就可以得到相同的Symbol值。

var s1 = Symbol.for('symbol');  //向全局注册了以"symbol"为描述符的Symbol

var s2 = Symbol.for('symbol');  
//由于描述符"symbol"已被注册到全局,因此这里创建的Symbol与上面是同一个
console.log(s1 === s2);//true

5、Symbol.keyFor()
如果你想得到一个全局注册的Symbol的描述符,可以使用Symbol.keyFor()方法:

let s1 = Symbol.for("foo");
console.log(Symbol.keyFor(s1)) // "foo"
let s2 = Symbol("foo");
console.log(Symbol.keyFor(s2))//undefined

Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key。变量s2属于未登记的 Symbol 值,所以返回undefined。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力做一只合格的前端攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值