首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >ES6 学习笔记之 Symbol

ES6 学习笔记之 Symbol

作者头像
我与梦想有个约会
发布2020-01-05 15:02:48
发布2020-01-05 15:02:48
3470
举报
文章被收录于专栏:jiajia_dengjiajia_deng

ES6 新增的 Symbol 功能还是比较多的,建议大家还是看看原著的内容来充分理解,我仅自己记录一些我可能需要用到的内容。

Symbol 返回的是一个唯一值,类似于 GUID,它的类型是 symbol,不能与字符串混淆。

代码语言:javascript
复制
let s = Symbol();
console.log(typeof s);
// symbol

Symbol 定义的方法名,只能通过方括号的方式来调用,如果使用了.运算符则会报错提示找不到这个方法。

代码语言:javascript
复制
let obj = {
  init() {
    return 'init';
  },
  [s]() {
    return 'Hello.';
  }
}

// obj.s(); 报错
obj[s](); // Hello.

遍历 Symbol 成员

代码语言:javascript
复制
console.log(Object.getOwnPropertyNames(obj));   // [ 'init' ]
console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol() ]
console.log(Reflect.ownKeys(obj));              // [ 'init', Symbol() ]

Symbol 还可以定义类似枚举类的东西,但它不是重复的,如下例子(来自书中):

代码语言:javascript
复制
const COLOR_RED    = Symbol();
const COLOR_GREEN  = Symbol();

function getComplement(color) {
  switch (color) {
    case COLOR_RED:
      return COLOR_GREEN;
    case COLOR_GREEN:
      return COLOR_RED;
    default:
      throw new Error('Undefined color');
    }
}

Symbol.for 方 Symbol.keyFor() 方法

Symbol.for 类似一个拷贝函数,可以将某个 Symbol 值重复利用。如下所示:

代码语言:javascript
复制
var s1 = Symbol.for('foo');
var s2 = Symbol.for('foo');
console.log(s1 === s2); // true

Symbol.for 先检查是否有同 key 的值存在,如果没有就新建,如果有就返回已经有的。如下所示:

代码语言:javascript
复制
Symbol.for('abc') === Symbol.for('abc'); // true
Symbol('abc') === Symbol('abc') // false

Symbol() 是没有登记机制的,所以无论你如何调用都会创建一个新的 symbol 值。而 Symbol.for 不同。Symbol.keyFor 方法可以取到 Symbol.for 登记的类型值的 key。

代码语言:javascript
复制
var ss1 = Symbol.for('abcdef');
console.log(Symbol.keyFor(ss1));  // abcdef

var ss2 = Symbol('abcdefg');
console.log(Symbol.keyFor(ss2));  // undefined

内置 Symbol 值

ES6 内置了很多内置值,我仅举个例子演示一下。更多其他内置方法请参考图书。

代码语言:javascript
复制
// Symbol.replace,在调用 replace 时会被调用。
const x = {};
x[Symbol.replace] = (...s) => console.log(s);

'Hello'.replace(x, 'World');
// ['Hello', 'World']

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年2月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Symbol.for 方 Symbol.keyFor() 方法
  • 内置 Symbol 值
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档