欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【ES2016】Symbol

程序员文章站 2024-02-21 10:02:34
...

Symbol

React中会用Symbol创建全局React类型,本文简单介绍以下Symbol,基本上是MDN文档的内容摘抄。

symbol构建

symbol是七种基本数据类型(primitive data type)之一。于ES2016新增。

symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法(在原型中)。不支持语法new Symbol()

每个从Symbol()返回的symbol值都是唯一的。symbol值能作为对象属性的标识符(id)。

const symbol1 = Symbol();
const symbol2 = Symbol(42);
const symbol3 = Symbol('foo');

console.log(typeof symbol1);
// expected output: "symbol"

console.log(symbol2 === 42);
// expected output: false

console.log(symbol3.toString());
// expected output: "Symbol(foo)"

console.log(Symbol('foo') === Symbol('foo'));
// expected output: false

全局共享的Symbol

Symbol()创建的symbol类型并不是全局可用的,因此在React创建ReactType的时候,显然不能用这个方法。需要跨文件可用、跨域可用的symbol类型,需要使用Symbol.for()Symbol.keyFor()方法在注册表设置和取得symbol。

Symbol.for()

Symbol() 不同的是,用 Symbol.for() 方法创建的的 symbol 会被放入一个全局 symbol 注册表中。Symbol.for() 并不是每次都会创建一个新的 symbol,它会首先检查给定的 key 是否已经在注册表中了。假如是,则会直接返回上次存储的那个。否则,它会再新建一个。

ymbol.for("foo"); // 创建一个 symbol 并放入 symbol 注册表中,键为 "foo"
Symbol.for("foo"); // 从 symbol 注册表中读取键为"foo"的 symbol


Symbol.for("bar") === Symbol.for("bar"); // true,证明了上面说的
Symbol("bar") === Symbol("bar"); // false,Symbol() 函数每次都会返回新的一个 symbol


var sym = Symbol.for("mario");
sym.toString();
// "Symbol(mario)",mario 既是该 symbol 在 symbol 注册表中的键名,又是该 symbol 自身的描述字符串

为了防止冲突,最好给你要放入 symbol 注册表中的 symbol 带上键前缀。(React就是这样做的)

Symbol.for("mdn.foo");
Symbol.for("mdn.bar");

Symbol.keyFor(sym)

Symbol.keyFor(sym) 方法用来获取全局symbol 注册表中与某个 symbol 关联的键。如果全局注册表中查找到该symbol,则返回该symbol的key值,返回值为字符串类型。否则返回undefined。

// 创建一个全局 Symbol
var globalSym = Symbol.for("foo");
Symbol.keyFor(globalSym); // "foo"

var localSym = Symbol();
Symbol.keyFor(localSym); // undefined,

// 以下Symbol不是保存在全局Symbol注册表中
Symbol.keyFor(Symbol.iterator) // undefined