symboooool
Symbol 是什么
symbol 是一种基本数据类型,Symbol() 函数是一个静态方法,会返回一个 symbol 类型的值,但它不是一个构造函数。
Symbol 的作用
在 js 代码中,对象的属性 key 必须是字符串,当使用引用类型作为 key 时,会调用 Symbol.toPrimitive / toString 转换成一个字符串。如:
1 | const a = {} |
Symbol 的一个主要作用就是作为对象的 key => 这可不是我瞎说的,原话:
Symbol 作为 key 有什么优势呢
- 因为 Symbol 生成的值是唯一的,所以可以保证 key 不冲突。当我们在写一个工具方法、库的时候,例如要在 window 上挂载一个全局变量,可能存在命名的冲突(虽然可能性也不大)。如果用 Symbol 就可以避免。
1 | const key1 = Symbol('my-util') // 参数仅仅作为标识作用 |
- 但是 uuid 不也可以实现吗?可以是可以,但 Symbol 类型的 key 值还有一个特性,就是它会在遍历时/序列化时被隐藏,可以模仿私有属性,如:
1 | const key = Symbol('private') |
- 虽然如此,但是 uuid 也可以实现类似的效果,只要关掉可枚举即可
1 | Object.defineProperty(obj, 'num', { |
- 而且强行要访问 symbol 类型的 key 也是可以的:
1 | Object.getOwnPropertySymbols(obj) // [Symbol(private)] |
所以要模拟也不是不行,但是 Symbol 更简便,为什么不用呢。
综上:Symbol 的作用在于生成唯一的值,并且作为一种弱形式的信息隐藏,主要作用是作为对象属性的标识符。