【ES2016】Symbol

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值