作用
一般用于唯一标识。
特点
- 不可枚举。不会被 for in、Object.getOwnPropertyNames() 访问到
- 基本数据类型。不能用 new (引用类型)
- 即便传入同样的参数,生成的 Symbol 值也不相等。
方法
- 生成
Symbol()
const foo = Symbol('foo');
const bar = Symbol('foo');
console.log(foo === bar); // false
console.log(typeof s); // "symbol"
Symbol.for() 检测上下文中是否存在使用该方法且相同参数创建的 Symbol 值,若存在则返回存在的值。不存在则新建。
const s1 = Symbol.for('foo');
const s2 = Symbol.for('foo'); // s2 = Symbol('foo'); //结果为 false
console.log(s1 === s2); // true
- 获取
Symbol.keyFor() 返回一个用 Symbol.for() 创建的 Symbol 值的 key
const foo = Symbol.for("foo");
const bar = Symbol("bar");
const keyFoo = Symbol.keyFor(foo);
const keyBar = Symbol.keyFor(bar);
console.log(keyFoo) // "foo"
console.log(keyBar) // undefined
Object.getOwnPropertySymbols() 可以获取指定对象的所有 Symbol 属性名
const obj = {};
let a = Symbol('a');
let b = Symbol('b');
obj[a] = 'Hello';
obj[b] = 'World';
const objectSymbols = Object.getOwnPropertySymbols(obj);
console.log(objectSymbols) // [Symbol(a), Symbol(b)]
场景
- 消除魔法字符串。
魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,改由含义清晰的变量代替。
if (type === 'basic') {
return <div>basic tab</div>
}
if (type === 'super') {
return <div>super tab</div>
}
// 改造后。basic、super 只是作为唯一标识,和具体值无关
const tabTypes = {
basic: Symbol(),
super: Symbol(),
}
if (type === tabTypes.basic) {
return <div>basic tab</div>
}
if (type === tabTypes.super) {
return <div>super tab</div>
}
- 作为对象的唯一属性,避免覆盖
const name = Symbol('name');
const obj = {
[name]: 'ClickPaas',
}
- 模拟类的私有方法
const speak = Symbol();
class Person {
[speak]() {
...
}
}
参考链接
https://juejin.cn/post/6844903812046520328
https://zhuanlan.zhihu.com/p/183874695