【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
推荐阅读
-
【ES2016】Symbol
-
Es2016新特性
-
ES2016指南
-
ES2016
-
引用阿里图标库的三种方式——多色图标我选symbol
-
Symbol到底是个啥玩意
-
visual C++ 2015 报错error LNK2019: unresolved external symbol [email protected] referenced in function
-
keil报错:Symbol set_value multiply define和 incomplete type is not allowed和error: #65: expected a “;“
-
详解ES6 Symbol 的用途
-
ES6新特性之Symbol类型用法分析