Symbol 了解多少?

62 阅读1分钟

概念

符号(Symbol) 是 ES6 新增的一种原始类型,用作非字符串的属性名。我们都了解JS 的基础类型 Object是一个属性的无序集合,其中每个属性都有一个名字和一个值。在 ES6 之前,属性名通常是字符串。但在 ES6 之后,符号也可以作为属性名。

let strname = 'string name'
let symname = Symbol('propname')
typeof strname
typeof symname
let o = {}
o[strname] = 2
o[symname] = '3'
console.log(o)

运行结果

image.png

用法

Symbol 类型没有字面量语法。要获取一个 Symbol 值,需要调用 Symbol 函数。这个函数永远不会返回相同的值,即使每次传入的参数都一样。可以将调用 Symbol 取得的符号值安全地用于为对象添加新属性,无须担心可能重写已有的属性。

符号的特点是他对代码是私有的,可以确保我们的代码的属性永远不会与其他代码的属性发生冲突。那我们想要共享符号值怎么办?

可以使用 Symbol.for()函数来实现,Symbol.for 函数接收一个字符串参数,返回一个与该字符串关联的符号值。如果没有符号值与该字符串关联,则会创建并返回一个新符号;否则,就会返回已有的符号。

let s = Symbol.for('shared')
let t = Symbol.for('shared')
console.log(s === t)
s.toString()
Symbol.keyFor(t)

结果

image.png