ES6新增的一种数据类型,最大的作用是,数据的 唯一性

定义局部变量

  1. const a1 = Symbol('a')
  2. const a2 = Symbol('a')
  3. console.log(a1); // Symbol(a)
  4. console.log(a2); // Symbol(a)
  5. console.log(a1 === a2) // false
  6. console.log(a1 == a2) // false
  7. console.log(typeof a1) // symbol
  8. // 不论哪种相等比较,都不相同

定义全局变量

  • keyFor用来描述 全局 Symbol注册表中的 key,用来查找 symbol变量。
  • for用来查找某个 symbol值得注册 key。当注册 key已经有 symbol 值时,不会再创建新值,而是直接返回当前值。 ```javascript const s1 = Symbol.for(‘s1’) const symKey = Symbol.keyFor(s1) console.log(symKey); // s1

if (Symbol.for(symKey)) { console.log(‘has s1’); } // has s1

  1. <a name="JlrKo"></a>
  2. ## 作为对象属性
  3. 某些时候,对象的属性不希望暴露。就可以用 `symbol`。
  4. - `symbol `作为对象属性,不能被普通 `for`循环遍历
  5. - 需要用特殊方法 `getOwnPropertySymbols`、`Reflect.ownKeys` 等,获取 symbol 属性
  6. ```javascript
  7. const a = Symbol('a')
  8. const b = Symbol('b')
  9. const obj = {}
  10. obj[a] = 'a'
  11. obj[b] = 'b'
  12. try {
  13. console.log('for of ----------->')
  14. for (let k of obj) {
  15. console.log(k, obj[k])
  16. }
  17. } catch (err) {
  18. console.log(err)
  19. }
  20. // for of ----------->
  21. // symbol.html:28 TypeError: obj is not iterable
  1. const obj = {}
  2. const a = Symbol('a')
  3. const b = Symbol('b')
  4. obj[a] = 'a'
  5. obj[b] = 'b'
  6. // 获取不到
  7. console.log(Object.keys(obj)); // []
  8. // 通过内置方法获取
  9. console.log(Object.getOwnPropertySymbols(obj)) // [Symbol(a), Symbol(b)]
  10. // 通过 Reflect 拦截获取
  11. console.log(Reflect.ownKeys(obj)) // [Symbol(a), Symbol(b)]

使用场景

😕一言难尽,适用场景并不多。凡是需要确保数据值唯一的地方,可以尝试使用 Symbol