Symbol定义

ES6中引入了一种新的数据结构,美名其曰 Symbol 。它出现的目的是为了解决我们在定义某特定的场景下,创建一个独一无二的值。

直接定义:

  1. // 没有参数的Symbol
  2. let sym1 = Symbol();
  3. let sym2 = Symbol();
  4. console.log(sym1 === sym2); // false
  5. // 有参数的Symbol
  6. let bol1 = Symbol('Symbol1')
  7. let bol2 = Symbol('Symbol2')
  8. console.log(bol1 === bol2); // false

description

上面定义的 Symbol 括号里面可以传参数,但是传了参数如何获取呢?那么接下来我们一起来看一下。

  1. let sym = Symbol('Symbol描述')
  2. console.log(sym.description); // Symbol描述

for

此for非彼for,在我们有需要需要使用同一个 Symbol 的时候。发现它是唯一的无法重新赋值给其他变量或者无法公用。那怎么办呢。那么我们在使用的时候就可以使用 Symbol.for 来定义。

  1. let cmd = Symbol.for('for 描述')
  2. let edn = Symbol.for('for 描述')
  3. console.log(cmd === edn); // true

keyFor

for定义的 Symbol 类型,如果添加了描述需要使用 keyFor 来获取

  1. console.log(Symbol.keyFor(cmd));

遍历

Symbol 使用for in 和for of 是无法遍历得到的,我们可以 Reflect.ownKeys 才能获取到~~

  1. let symbol = Symbol()
  2. let obj = {
  3. name:"前端伪大叔",
  4. [symbol]:19
  5. }
  6. // 使用for in 变量无法变量 symbol类型的
  7. for (const k in obj) {
  8. console.log(k);
  9. }
  10. // 使用for of 通用无法变量 symbol类型
  11. for (const k of Object.keys(obj)) {
  12. console.log(k);
  13. }
  14. // 使用Reflect.ownKeys 就可以完美的轻松遍历
  15. for (const k of Reflect.ownKeys(obj)) {
  16. console.log(k);
  17. }