前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES2021 我学不动了,这次只学 3 个。

ES2021 我学不动了,这次只学 3 个。

作者头像
秋风的笔记
发布2020-11-24 10:19:34
2520
发布2020-11-24 10:19:34
举报
文章被收录于专栏:秋风的笔记秋风的笔记

秋裤,你最近在干哈呢?

最近在看 ES2021 呢。

这才 2020 年,你学啥2021呢,学不动,学不动

你的 2020 进度84%

▓▓▓▓▓▓▓▓▓▓▓▓▓░░░

那你说一说呗,都学了些啥?还有,能不能说简单一点,我怕我学不动。

目前已经确定的有 5 个新特性,为了能让你更好地记住,我特定挑了 3 个我觉得比较有意思的和你讲讲吧。

好好好,最喜欢用最少的时间学最有用的东西了!

1.逻辑操作符

你有遇到过这样的情况吗?

代码语言:javascript
复制
function example(a) {
  // Default `a` to "foo"
  if (!a) {
    a = "foo";
  }
  // or
  a = a || "foo";
}

某些初始化的时候需要一些冗长的逻辑代码

代码语言:javascript
复制
function example(opts) {
  // Ok, but could trigger setter.
  opts.foo = opts.foo ?? "bar";

  // No setter, but 'feels wrong' to write.
  opts.baz ?? (opts.baz = "qux");
}

example({ foo: "foo" });

你别说,还真有,有时候写多了,我还有点头晕。

你别打断我,我这是一个自问自答模式,你不用回答。

刚才讲到哪里来着,哦,代码不够简洁。激动人心的时候到了,现在有了新的特性,以后可以写的更加清楚了。

代码语言:javascript
复制
function example(opts) {
  // 旧的方式
  if (!a) {
    a = "foo";
  }
  // or
  a = a || "foo";
  // 新的方式
  a ||= "foo"
}

example({ foo: "foo" });
代码语言:javascript
复制
function example(opts) {
  // 旧的方式
  opts.foo = opts.foo ?? "bar";
  // 新的方式
  opts.foo ??= "bar";

  // 旧的方式
  opts.baz ?? (opts.baz = "qux");
  // 新的方式
  opts.baz ??= "qux";
}

example({ foo: "foo" });

看着是不是比之间简洁了很多,有没有觉得这个模式感觉很熟悉?

emm,这个真是个疑问句,配合一下。

得了!对!逻辑运算符中常用的嘛。以前也有,往下看。

代码语言:javascript
复制
a = a + b;  // old
a += b;
a = a - b; // old
a -= b;

对的,这一次加入了 3 个 ||&&?? ,用法还是和以前一样,是不是很简单?

嗯,没有新的使用成本,不错!有点意思,继续讲。

接下来这个可厉害了,是 Promise.any

2.Promise.any

Promise.any。从字面意思来看,相信聪明的你应该能大致猜出这个 API 的作用。Promise.any 接受一个 Promise 的数组。当其中任何一个 Promise 完成(fullfill)时,就返回那个已经有完成值的 Promise。如果所有的 Promise 都拒绝(reject),则返回一个拒绝的 Promise,该 Promise 的返回值是一个 AggregateError 对象。

代码语言:javascript
复制
Promise.any(promises).then(
  (first) => {
    // 任意一个Promise完成了
  },
  (error) => {
    // 所有Promise都被拒绝了
  }
);

这个有什么具体的场景吗?

给一个官方的例子,最简单的就是测试哪个站点的速度最快。

代码语言:javascript
复制
Promise.any([
  fetch("https://v8.dev/").then(() => "home"),
  fetch("https://v8.dev/blog").then(() => "blog"),
  fetch("https://v8.dev/docs").then(() => "docs"),
])
  .then((first) => {
    // Any of the promises was fulfilled.
    console.log(first);
    // → 'home'
  })
  .catch((error) => {
    // All of the promises were rejected.
    console.log(error);
  });

例如一些播放平台,可以通过这个来测试当前延迟最低的线路是哪个,优先切换到对应的最快的线路。

好东西,有一个问题,这个和Promise.all 好像呀

没错,我们可以把这两个一起记忆, 我们可以把 Promise.any 理解成 Promise.all 的相反操作。下面我通过 Promise.all 来降级模拟promise.any 来加深记忆。

你别这种眼神看着我,我又不是不讲。

来,亮出祖传降级代码

代码语言:javascript
复制
function reverse(promise) {
  return new Promise((resolve, reject) =>
    Promise.resolve(promise).then(reject, resolve)
  );
}
function promiseAny(iterable) {
  return reverse(Promise.all([...iterable].map(reverse)));
}
// https://github.com/m0ppers/promise-any/blob/master/index.js

实现很简单,通过一个反转函数,利用 Promisea.all 的特性,只要一个Promise 被拒绝了,就进入到reject,因此反转resolvereject就能模拟出 Promise.any 了。

我想想....秒啊 !将 Promise.allreject当做是Promise.anyresolve ,最后一个呢?

先考你一个问题,1000000000 这是多少?

10 亿

100,000,000 这个呢

1 亿

你觉得有什么差别吗?

有,黑夜给了我黑色的眼睛,你却让我瞎了眼。

正经点。

第一个没有 “,” 间隔标识,太难读懂了。

接下来要讲的新特性就是数字分隔符,有了这个特性,你黑色的眼睛就可以去寻找光明了。

3.数字分隔符

代码语言:javascript
复制
let fee1 = 1000000000;
let fee2 = 1_000_000_000;  // fee1 === fee2

这个模式不仅在十进制可以用,二进制,十六进制....甚至 BigInt,都可以使用。

代码语言:javascript
复制
// Binary Literals
let nibbles = 0b1010_0001_1000_0101;
// Hex Literal
let message = 0xa0_b0_c0;
// BigInt Literal
const max = 2n ** (64n - 1n) - 1n;
console.log(max === 9_223_372_036_854_775_807n);

以上特性均在最新版 chrome 支持,快打开控制台玩耍吧。

如果想要在实际项目中使用,请使用以下两个插件。

  • Logical Assignment Operator[1]
  • Numeric Separator[2]

[1]Logical Assignment Operator: https://babeljs.io/docs/en/babel-plugin-proposal-logical-assignment-operators

[2]Numeric Separator: https://babeljs.io/docs/en/babel-plugin-proposal-numeric-separator

[3]https://juejin.im/post/6856704516499832845

[4]https://github.com/tc39/proposals/blob/master/finished-proposals.md

❤️ 交流讨论

欢迎关注公众号 「秋风的笔记」,主要记录日常中觉得有意思的工具以及分享开发实践,保持深度和专注度。回复"好友"可加微信,秋风的笔记常年陪伴你的左右。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秋风的笔记 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.逻辑操作符
  • 2.Promise.any
  • 3.数字分隔符
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档