Symbol-独一无二的值
2022-06-23 本文已影响0人
skoll
简介
1 .作为一个对象或一个Map的键值,他可以保证你的对象或Map的键值不重复
2 .即使传入相同的值,他生成的字符串也是不唯一的
3 .Symbol类型唯一合理的用法是用变量存储 symbol的值,然后使用存储的值创建对象属性
4 .如果我们想要向“属于”另一个脚本或者库的对象添加一个属性,我们可以创建一个 symbol 并使用它作为属性的键。symbol 属性不会出现在 for..in 中,因此它不会意外地被与其他属性一起处理。并且,它不会被直接访问,因为另一个脚本没有我们的 symbol。因此,该属性将受到保护,防止被意外使用或重写
返回symbol
1 .Object.getOwnPropertySymbols(obj)
2 .Reflect.ownKeys(obj)
可能会操作到symbol的
1 .
使用场景1 消除魔术字符串
1 .代码中出现多次,与代码形成强耦合关系的某一个具体的字符串或者数值,风格良好的代码,应该尽量消除魔术字符串,由清晰的变量代替
const tabTypes = {
basic: Symbol(),
super: Symbol(),
}
if (type === tabTypes.basic) {
return <div>basic tab</div>
}
if (type === tabTypes.super) {
return <div>super tab</div>
}
2 .我不关心他真正的值是什么,反正不和其他的相等就可以
使用场景2 避免覆盖之前的属性,给对象添加新属性的时候
const name = Symbol('name');
const obj = {
[name]: 'ClickPaas',
}
使用场景3 模拟私有方法
1 .代码的任何其他部分都不能意外访问或重写这些属性
const speak = Symbol();
class Person {
[speak]() {
...
}
}
//因为外面根本就造出来一个speak的symbol类型,所以一定是安全的
使用场景3 类的单例模式
1 .保证一个类仅有一个实例,并提供一个访问它的全局访问点。
2 .解决:一个全局使用的类频繁地创建与销毁
3 .使用场景:当您想控制实例数目,节省系统资源的时候