整理ES6:聊一聊Symbol

发布 : 2023-07-05 分类 : JavaScript

原文链接:https://github.com/taoliujun/blog/issues/15

我在5年前看完Symbol,就将它抛之脑后,直到最近才重新研究,看看它是什么样的宝藏。

先快速看下它是什么。

Symbol 基本用法

1
2
3
4
5
6
7
8
const a1 = Symbol();
const a2 = Symbol("i am a");
const a3 = Symbol("i am a");

console.log("a1", a1);
console.log("a2", a2);
console.log("a2", a2.description);
console.log("a2 === a3", a2 === a3);
1
2
3
4
a1 Symbol()
a2 Symbol(i am a)
a2 i am a
a2 === a3 false
  • 从上可看到,Symbol是一个函数,它的返回值是一个Symbol类型的值,这个值是唯一的,即使传入相同的参数,也不会相等。
  • 入参的目的仅仅是为了描述它的来源。
  • description返回Symbol实例的描述。

让我使用它

假设如下代码:

1
2
3
4
5
6
7
8
9
const WOMAN = "woman";
const MAN = "man";

function getSex(input) {
if (input === WOMAN) return 1;
if (input === MAN) return 2;
}

console.log(getSex(MAN));

但代码足够复杂,或出于粗心,几个常量的值设置为一样的字符串,怕是难以发现。那么用Symbol可以方便的保证其唯一性。

1
2
3
const WOMAN = Symbol();
const MAN = Symbol();
// ...more

Symbol 的全局注册

直接看代码:

1
2
3
4
5
6
7
8
9
10
function fn1() {
return Symbol("a");
}

function fn2() {
return Symbol.for("a");
}

console.log("fn1", fn1() === fn1());
console.log("fn2", fn2() === fn2());
1
2
fn1 false
fn2 true

正如前面说的,Symbol函数的返回值肯定是不一样的,所以多次fn1的执行结果是不相等的。但是Symbol.for的执行结果是相等的,因为它是全局注册的。