Symbol类型

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.definePropertyobject.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/)));

南无阿弥陀佛,祝你吉祥!

上一篇:ES6-11学习笔记--Symbol


下一篇:JavaScript之ES6+的常用新特性