# JavaScript | Symbol 类型

个人感觉平时很少在实际项目中见到 Symbol 类型,但如果想深入学习原理,Symbol 类型的理解必不可少。

# 目录




# Symbol 类型

“Symbol”值是一种表示唯一的标识符,用于创建对象的“隐藏”属性,防止他人编写代码引用自己的脚本时产生无意的冲突,导致访问或者重写这些属性。

let id = Symbol();      // id是Symbol的一个实例化对象
let id1 = Symbol("id"); // Symobol()内可以添加对对象的描述
let id2 = Symbol("id"); // 与id1一样,描述都为”id“

alert(id1 == id2);      // false

如果想要打印描述,不能直接使用变量名,而需要显式调用toString()方法。

想要在object字面量中使用Symbol,需要使用方括号。

let id = Symbol("ID");

let user = {
  name: "John",
  [id]: 123
};

Symbol 在 for...in 中会被跳过,在 Object.assgin 中会被复制。

Symbol 不是完全隐藏的,有内置方法可以获取。

# 全局 Symbol

JavaScript ES6 提出的 Symbol 存在一个全局 symbol 注册表。使用 Symbol.for(key) 可以在注册表中创建或读取 Symbol。

该调用会检查全局注册表,如果有一个描述为 key 的 Symbol,则返回该 Symbol,否则将创建一个新 Symbol(Symbol(key)),并通过给定的 key 将其存储在注册表中。

let id = Symbol.for("id");      // 如该 Symbol 不存在,则创建它

let idAgain = Symbol.for("id"); // 再次读取

alert( id === idAgain );        // 两者相同

# 反向调用

Symbol.for(key)使用名称返回一个symbol变量。 Symbol.keyFor(sym)使用symbol变量返回一个名称。

# 系统 Symbol

JavaScript 内部还留有一些系统Symbol,我们可以使用它们来微调对象的各个方面。

// 暂略


上次更新: 2020/3/3 17:31:22