赞
踩
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.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。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。