js基本类型---symbol标识符

认识symbol

        symbol 是一种基本数据类型,“symbol” 的值表示唯一的标识符,可以把它看成一串‘独立’数据,每创建一个Symbol都是一个新值,这和它的描述参数无关。

Symbol([description])

description:
可选的,字符串类型。对 symbol 的描述,可用于调试但不是访问 symbol 本身。

注意  : 它不支持语法:"new Symbol()",构造时不使用new关键字

let id1 = Symbol('id');
let id2 = Symbol('id');

console.log(id1 == id2);

        一般来说完全一样的构造方式赋值的变量应该是等值的(指向的地址一样),但是symbol不同,它每次构造出来都会分一块新的地址,这和它的构造参数没有关系(不会因为构造参数一致而引用同一个地址)

每一个symbol都是一个唯一的值,虽然都是id的描述参数,但它们并不等价,

"隐藏"属性 

symbol和字符(串)是唯二的可以作为对象的属性键 的类型,当你用其他类型的值来充当对象的键时,它们都会被隐式转换成字符(串),比如 数字 ‘1’,会被转换成字符 '1',

let obj = {
  "object":'item0',
  [id1]: 'item1',
  [id2]: 'item2',
  [Symbol('id')]: 'item3'
}

console.log(obj[id1]);
console.log(obj[Symbol('id')]);
console.log(obj);

这里构造了1个obj对象,内部使用了3个symbol作为键,当使用symbol作为键时需要带上'[ ]'否则会被转成字符串'id1'

这里我们可以看到用变量储存起来的symbol键还是能够访问到值的,但是无法访问到Symbol(’id)键的值,很显然这个symbol和对象里的symbol是不相同的,也就是说我们无法访问到这个对象的这个属性并对其操作,这个属性被‘隐藏’起来了

但是我们任然可以打印对象查看对象的所有的键值,这表示对象里面确实存在symbol键存的值,从打印结果来看这个对象同一个键有3个不同的值,

for (let index in obj) {
  console.log(obj[index]);
}

遍历一遍对象,可以看到不仅最后一个symbol无法访问,前面用变量存放的symbol键也无法访问到,只打印了对象的第一个值,

 所以我们可以知道,symbol作为对象属性键,是‘不可枚举’的属性,循环时被排除在外

symbol的方法(全局symbol)

两个相同描述的symbol不相等,我们就没有办法通过描述来拿到同一个symbol,但有时我们想要名字相同的 symbol 具有相同的实体,所以会有一个 全局 symbol 注册表,注册表内的 symbol 被称为 全局 symbol,

Symbol.for(key)
使用给定的 key 搜索现有的 symbol,如果找到则返回该 symbol。否则将使用给定的 key 在全局 symbol 注册表中创建一个新的 symbol。

Symbol.keyFor(sym)
从全局 symbol 注册表中,为给定的 symbol 检索一个共享的?symbol key。

Symbol.for(key),key:字符串,通过key读取注册表中的symbol,若没有则构造一个symbol,这个方法可以实现构造两个一样的symbol,

 Symbol.keyFor(sym),sym:symbol,读取注册表中的symbol,并返回它的描述参数,

let newId = Symbol.for('id');
let oldId = Symbol.for('id');

console.log( oldId);
console.log( newId);
console.log( oldId == id1);
console.log( oldId == id2);
console.log( oldId == newId);

console.log(Symbol.keyFor(id1));
console.log(Symbol.keyFor(id2));
console.log(Symbol.keyFor(newId));
console.log(Symbol.keyFor(oldId));

keyFor方法只能读取注册表内的symbol(for方法构造的symbol),无法读取id1,id2,

而注册表中的symbol,同参数是相等的,

总结

symbol 是唯一标识符的基本类型

symbol 是使用带有可选描述(name)的 Symbol() 调用创建的。

symbol 总是不同的值,即使它们有相同的名字。如果我们希望同名的 symbol 相等,那么我们应该使用全局注册表:Symbol.for(key) 返回(如果需要的话则创建)一个以 key 作为名字的全局 symbol。使用 Symbol.for 多次调用 key 相同的 symbol 时,返回的就是同一个 symbol。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值