Symbol

es6 新增的基本数据类型,通过 Symbol 声明得变量具有唯一性。

1
2
3
const sym1 = Symbol("123");
const sym2 = Symbol("123");
console.log(sym1 === sym2); // false

判断类型

因为 Symbol 是基本数据类型,我们可以通过 typeof 来判断

1
2
const str = Symbol("123");
console.log(typeof str); // "symbol"

Symbol 在对象中的使用

1
2
3
4
5
6
7
8
const obj = {
name: "zhangsan",
};
// 对象赋值
obj.name = "";
// 对象添加属性并赋值
obj["name"] = "lisi";
console.log(obj); // 'lisi'

通过上面得例子我们可以得知,对象得属性具有唯一性,重新设置值会覆盖原有得值,所以在学习了 Symbol 类型之后,有了我们下面得代码:

1
2
3
4
5
6
7
8
9
const obj = {
name: "zhangsan",
};
const snmae = Symbol("name");
// symbol 赋值
obj[snmae] = "zhangsan";
console.log(obj.name);
// symbol取值
console.log(obj[snmae]);

Tps:

1
Symbol 作为对象属性名时不能用.运算符,要用方括号。因为.运算符后面是字符串,所以取到的是字符串 sy 属性,而不是 Symbol 值 sy 属性。

Symbol 查找
for
用来定义便于查找得 symbol 类型得值,找到返回该 Symbol 值,没有则新建并返回一个以该字符串参数为名称的 Symbol 值,并登记在全局环境中供搜索.

1
2
3
4
5
6
7
8
const str1 = Symbol("123");
// for会在全局环境中查找
const str2 = Symbol.for("123");
const str3 = Symbol.for("123");

console.log(str1 === str2); // false
console.log(str2 === str3); // true
console.log(Symbol.keyFor(str2)); // true

keyFor

1
2
3
4
const str1 = Symbol("123");
const str2 = Symbol.for("123");
console.log(Symbol.keyFor(str1)); // false
console.log(Symbol.keyFor(str2)); // trues