当前位置:   article > 正文

js基本类型---symbol标识符_js symbol属于什么类型

js symbol属于什么类型

认识symbol

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

  1. Symbol([description])
  2. description:
  3. 可选的,字符串类型。对 symbol 的描述,可用于调试但不是访问 symbol 本身。

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

  1. let id1 = Symbol('id');
  2. let id2 = Symbol('id');
  3. console.log(id1 == id2);

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

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

"隐藏"属性 

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

  1. let obj = {
  2. "object":'item0',
  3. [id1]: 'item1',
  4. [id2]: 'item2',
  5. [Symbol('id')]: 'item3'
  6. }
  7. console.log(obj[id1]);
  8. console.log(obj[Symbol('id')]);
  9. console.log(obj);

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

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

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

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

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

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

symbol的方法(全局symbol)

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

  1. Symbol.for(key)
  2. 使用给定的 key 搜索现有的 symbol,如果找到则返回该 symbol。否则将使用给定的 key 在全局 symbol 注册表中创建一个新的 symbol。
  3. Symbol.keyFor(sym)
  4. 从全局 symbol 注册表中,为给定的 symbol 检索一个共享的?symbol key。

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

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

  1. let newId = Symbol.for('id');
  2. let oldId = Symbol.for('id');
  3. console.log( oldId);
  4. console.log( newId);
  5. console.log( oldId == id1);
  6. console.log( oldId == id2);
  7. console.log( oldId == newId);
  8. console.log(Symbol.keyFor(id1));
  9. console.log(Symbol.keyFor(id2));
  10. console.log(Symbol.keyFor(newId));
  11. 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。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/909232
推荐阅读
相关标签
  

闽ICP备14008679号