Symbol 小试

3 篇文章 0 订阅
1 篇文章 0 订阅

作用

一般用于唯一标识。

特点

  • 不可枚举。不会被 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值