1.基本方法
let a=Symbol();//创建一个symbol
symbol本身是原始类型,所以typeof的时候返回symbol,而不是object
console.log(typeof a);
使用symbol时,能够传入一个字符串键值,但是这个参数与它本身的定义无关,而与人相关。
let a=Symbol();
let b=Symbol();
console.log(a === b);
即使好像a与b是一样的,但是它们还是不同,因为存储的地方不一样,所以false。
symbol也是即为特殊的,它和string, number, boolean都不同。它是孤独的,与new无缘,new一个会报错。
2.使用全局符号
所谓全局符号就是使用 Symbol.for()的方法来创建这个符号,它与普通的Symbol()创建不同,它是全局的,被存放在全局注册表里。
当使用 symbol.for 时,这个方法会对键值进行检索,如果存在则返回它,如果不存在就创建一个symbol并放入注册表里。
let a=Symbol.for('foo');
let b=Symbol.for('foo');
console.log(a === b);
这会返回true,因为他们是同一个符号。
还可以使用 symbol.keyfor 方法来查询键值,参数是符号,如果参数不是符号,则会报错,TypeError。
let a=Symbol.for('foo');
//let b=Symbol.for('foo');
console.log(Symbol.keyFor(a));//输出foo
3.符号作为属性
这点非常炫酷,它就像一个代号
object.defineProperty与object.defineProperties能够为对象添加符号属性。这是2个非常重要的方法。
let symArr = new Array();
for(let i=0;i<3;i++) {
symArr[i] = Symbol(i);
}
let obj={};
for(let i=0;i<symArr.length;i++) {
// 第一个参数 object
// 2 符号
// 3 对应的值
Object.defineProperty(obj,symArr[i],{value:i});
}
console.log(obj);
let sym1 = Symbol('1');
let sym2 = Symbol('a');
let sym3 = Symbol('b');
let a={};
a[sym1] = '123';
//第一个参数 object
//2 符号列表
Object.defineProperties(a,{
[sym2]:{value:'hello'},
[sym3]:{value:'world'}
});
console.log(a);
有创建,当然就有获取,它们分别是 Object.getOwnPropertySymbols | Object.getOwnPropertyNames | Object.getOwnPropertyDescriptors | Reflect.ownKeys
第一个函数返回对象实例的符号属性数组,第二个普通属性数组,3:包括前面2个的描述符对象,4:返回2个类型的属性
let sym1 = Symbol('1');
let sym2 = Symbol('a');
let sym3 = Symbol('b');
let a={m:'haha'};
a[sym1] = '123';
Object.defineProperties(a,{
[sym2]:{value:'hello'},
[sym3]:{value:'world'}
});
console.log(Object.getOwnPropertySymbols(a));
console.log(Object.getOwnPropertyNames(a));
console.log(Object.getOwnPropertyDescriptors(a));
console.log(Reflect.ownKeys(a));
看起来确实繁琐,不过用的时候也还好。
如果没有显示的保存引用,简单来说就是没有用变量存储它,那就必须进行查找,才能使用。
console.log(Object.getOwnPropertySymbols(a).find(Symbol=>Symbol.toString().match(/1/)));
南无阿弥陀佛,祝你吉祥!