ES6 JavaScript中Symbol的作用

2022-07-07  本文已影响0人  mudssky

ES6 JavaScript中Symbol的作用

从一开始接触es6,两三年了,JavaScript中有7种原始数据类型.

但是这个Symbol一直不知道有什么作用,不像es2020新出的bigint很好理解,就是大数运算用的,平时基本用不上,而且typescript没有支持这个语法编译到es5.

网上查了几篇文章,总结就是,Symbol的主要作用是作为对象的属性.

因为Symbol有两个特性

  1. 没有两个Symbol是相等的
  2. Symbol 数据值可以作为对象属性名(Symbol没出之前只能是字符串)

所以Symbol主要有以下两个使用场景

  1. 作为对象属性 当一个复杂对象中含有多个属性的时候,很容易将某个属性名覆盖掉,利用 Symbol 值作为属性名可以很好的避免这一现象。
const name = Symbol('name');
const obj = {
    [name]: 'zhangsan',
}
  1. 模拟类的私有方法

ES6 中的类是没有 private 关键字来声明类的私有方法和私有变量的,但是我们可以利用 Symbol 的唯一性来模拟。

因为使用者在外部无法创建一个一样的speak,所以就无法在外部调用到这个方法

const speak = Symbol()
class Person {
    [speak]() {
        ...
    }
}

Symbol相关方法

let sym1 = Symbol('sym')
let sym2 = Symbol('sym')
console.log(sym1==sym2) ;  // 输出 false

全局符号注册表

symbol.for() 可以在全局注册symbol

symbol.for() 会先检查全局运行时注册表,如果不存在则创建一个 symbol 实例并将其添加到全局符号注册表中,如果存在则直接返回该 symbol 实例。

let sym1 = Symbol.for('sym')
let sym2 = Symbol.for('sym')
console.log(sym1==sym2) ;  // 输出 true

使用 Symbol.keyFor()来查询全局符号注册表。通过接收参数为 symbol 类型,返回该 symbol 对应的字符串键,如果查询不到则返回 undefined

let s = Symbol.for('sym'); 
console.log(Symbol.keyFor(s)); // sym
console.log(Symbol.keyFor(s2)); // 报错 TypeError: s2 is not a symbol

常用内置 symbol

上一篇 下一篇

猜你喜欢

热点阅读