超全超实用的ES2021新特性

ES2021新特性

关于ES的新特性的学习必然是必须的,目前已发布已被增添到 Google Chrome V8 引擎中的特性将于本文学习

1 String.prototype.replaceAll

我们都知道String.prototype.replace()方法来完成字符串的替换

'betterman'.replace('e','1111')
// "b1111tterman"

String.prototype.replace() 方法中,当第一个参数是字符串类型时,只替换第一个匹配的字符串,如果我们需要全换所有就需要使用正则匹配到

'betterman'.replace(/e/g,'1111')
// "b1111tt111rman"

我们使用新特性就不需要使用正则了

replaceAll()方法返回一个新字符串,新字符串所有满足 pattern 的部分都已被replacement 替换。pattern可以是一个字符串或一个 RegExp, replacement可以是一个字符串或一个在每次匹配被调用的函数。

'betterman'.replaceAll('e','1111')
'betterman'.replaceAll(/e/g,'1111')
// "b1111tt111rman"

注意: 第一个参数可以是一个字符串或一个 RegExp,当使用一个 regex时,您必须设置全局(“g”)标志

2 逻辑赋值运算符

逻辑赋值运算符是由逻辑运算符和赋值表达式组合而成

  • ||=

当左侧变量的返回值为false 的时候执行右边的赋值运算

    //原来的写法
    a || (a = b);


    if (!a) {
   
        a = b;
    }

    //可以写成
    a ||= b;
   
  • &&=
    当左侧的返回值为true的时候执行右边的赋值运算
    //原来的写法
    a && (a = b);

    if (a) {
   
        a = b;
    }

    //可以写成
    a &&= b;
  • ??=
    在ES2020中入了??(空位合并操作符)表达式的概念,如果表达式在??的左侧运算符求值为 undefined 或 null,就返回其右侧默认值。

在仅当左侧变量为 undefined 或 null 时,该操作符才将右侧变量赋值给左侧变量

    a ?? (a = b);
    if (a === null || a === undefined) {
   
        a = b;
    }

    //可以写成
    a ??= b;

3 Promise.any

Promise.any 方法和 Promise.race 类似只要给定的迭代中的一个 promise 成功,就采用第一个 promise 的值作为它的返回值,
但与Promise.race 的不同之处在于它会等到所有 promise 都失败之后,才返回失败的值:


const myFetch = url => setTimeout(() => fetch(url), Math.floor(Math.random() * 3000));
const promises = [
  myFetch('/endpoint-1'),
  myFetch('/endpoint-2'),
  myFetch('/endpoint-3'),
];
// 使用 .then .catch
Promise.any(promises) // 任何一个 promise 成功。
       .then(console.log) // 比如 ‘3’
       .catch(console.error); // 所有的 promise 都失败了
// 使用 async-await
try {
   
  const first = await Promise.any(promises); // 任何一个 promise 成功返回。
 console.log(first);
}catch (error) {
    // 所有的 promise 都失败了
  console.log(error);
}

4 数字分割符

在日程生活中我们习惯用 , 将要识别的数字分割开, 在代码我们在用于数字数值较大时对数字进行_分割,可提高数字的可读性

// 8888888888 不易辨识
const count1 = 8888888888;

// 8_888_888_888 很直观
const count2 = 8_888_888_888;

console.log(count1 === count2); // true

5 WeakRef

WeakRef对象允许您保留对另一个对象的弱引用,而不会阻止被弱引用对象被GC(垃圾)回收
WeakRef对象包含对对象的弱引用,这个弱引用被称为该WeakRef对象的target或者是referent。对对象的弱引用是指当该对象应该被GC回收时不会阻止GC的回收行为。而与此相反的,一个普通的引用(默认是强引用)会将与之对应的对象保存在内存中。只有当该对象没有任何的强引用时,JavaScript引擎GC才会销毁该对象并且回收该对象所占的内存空间。如果上述情况发生了,那么你就无法通过任何的弱引用来获取该对象。

const ref = new WeakRef({
    name: 'better' });
let obj = ref.deref();
if (obj) {
   
  console.log(obj.name); // better
}

MDN说为什么尽量避免使用

正确使用WeakRef对象需要仔细的考虑,最好尽量避免使用。避免依赖于规范没有保证的任何特定行为也是十分重要的。何时、如何以及是否发生垃圾回收取决于任何给定JavaScript引擎的实现。GC在一个JavaScript引擎中的行为有可能在另一个JavaScript引擎中的行为大相径庭,或者甚至在同一类引擎,不同版本中GC的行为都有可能有较大的差距。GC目前还是JavaScript引擎实现者不断改进和改进解决方案的一个难题。

6 Intl.ListFormat

Intl.ListFormat 是一个语言相关的列表格式化构造器。
首个参数是一个语言标识(locale),而第二个参数是一个选项对象 – 包含了 style 和 type 两个属性。

  • type
    消息输出的格式。可选的值有用于替代基于“且”关系列表的"conjunction" (默认值, 例如: A, B, and C), 或者用于替代基于“或”关系列表的 “disjunction”(例如: A, B, or C),以及用于替代带计量单位的值列表的"unit" (例如: 5 pounds, 12 ounces).
  • style
    被格式化消息的长度。可选值有:“long” (默认值,例如: A, B, and C)、“short” 或者 “narrow” (例如: A, B, C)。 当style 的值为narrow时,type 属性的值只能取值unit。
const arr = ['Pen', 'Pencil', 'Paper']
 
let obj = new Intl.ListFormat('en', {
    style: 'short', type: 'conjunction' })
console.log(obj.format(arr)) 
 
/**** 输出 ****/
// Pen, Pencil, & Paper
 
 
obj = new Intl.ListFormat('en', {
    style: 'long', type: 'conjunction' })
console.log(obj.format(arr)) 
 
/**** 输出 ****/
// Pen, Pencil, and Paper
 
 
obj = new Intl.ListFormat('en', {
    style: 'narrow', type: 'conjunction' })
console.log(obj.format(arr)) 
 
/**** 输出 ****/
// Pen, Pencil, Paper
 
 
// 传入意大利语标识
obj = new Intl.ListFormat('it', {
    style: 'short', type: 'conjunction' })
console.log(obj.format(arr)) 
 
/**** 输出 ****/
// Pen, Pencil e Paper
 
 
// 传入德语标识
obj = new Intl.ListFormat('de', {
    style: 'long', type: 'conjunction' })
console.log(obj.format(arr)) 
 
/**** 输出 ****/
// Pen, Pencil und Paper

7 Intl.DateTimeFormat 的 dateStyle 和 timeStyle 选项

Intl.DateTimeFormat 对象是一个支持语言敏感日期和时间格式化的构造器。拟议的 dateStyle 和 timeStyle 选项可被用于获取一个 locale 特有的日期和给定长度的时间。

// 短格式的时间
let o = new Intl.DateTimeFormat('en' , {
    timeStyle: 'short' })
console.log(o.format(Date.now()))
// 11:27 PM
 
 
// 中等格式的时间
o = new Intl.DateTimeFormat('en' , {
    timeStyle: 'medium'})
console.log(o.format(Date.now()))
// 11:27:57 PM
 
 
// 长格式的时间
o = new Intl.DateTimeFormat('en' , {
    timeStyle: 'long' })
console.log(o.format(Date.now()))
// 11:27:57 PM GMT+11
 
 
// 短格式的日期
o = new Intl.DateTimeFormat('en' , {
    dateStyle: 'short'})
console.log(o.format(Date.now()))
// 10/6/20
 
 
// 中等格式的日期
o = new Intl.DateTimeFormat('en' , {
    dateStyle: 'medium'})
console.log(o.format(Date.now()))
// Oct 6, 2020
 
 
// 长格式的日期
o = new Intl.DateTimeFormat('en' , {
    dateStyle: 'long'})
console.log(o.format(Date.now()))
// October 6, 2020

参考文章

全部评论

相关推荐

头像
01-12 14:44
已编辑
百度_高级研发工程师
今天看到了某平台攻击牛友的帖子,段段今天打算为牛友们说句话,我们的努力到底有没有意义。 (原文复述:感觉牛客就是当年那群做题区毕业了开始找工作还收不住那股味,颇有一种从年级第一掉到年纪第二后抱怨考不上大学的区味)  粗鄙,无礼,傲慢,攻击,在这里我没有看到任何有用的分析,我只看到了屁股决定脑袋的攻击,我只看到了嫉妒和眼红。一、去医院不看病你去逛街吗 去医院你不去看病你去逛街吗?去加油站不加油你去抽烟吗?去部队你不训练战斗技能你去养老吗?来牛客你不努力求职你来干什么来了。 牛客本身就是个求职平台,大家分享有用的知识,分享面经,分享offer,分享求职经验的,来牛客不就干这个来了吗?有什么问题吗?...
给个好点的工作吧啊啊...:不知道我看的是不是和博主同样的帖子,我记得原帖是表达的是有些匿名老是发几十万的offer侮辱价,然后就有牛友觉得凡尔赛了导致后面的评论有些偏激。我觉得这个最近闫学晶那个事情有点类似了,她说他儿子一年只能赚七八十万家庭生活都难以为继,不说普通家庭,多少大厂的程序员都赚不到这个数字,大部分家庭看到这种发言肯定会难受的一p,生活的担子又这么重,人都是需要发泄情绪的,互联网就是个极佳的载体,所以很多人直接就喷她了,人在情绪发泄的时候是不思考的,否则就不叫发泄了。然后还有一个点,段哥假定了这些喷的人全都是“躺平的”,这点可能有失偏颇,很多人一直在努力,但是始终缺乏天时地利人和的某一个条件,这点相信段哥找工作的过程中深有体会。绝大部分人都以结果的失败去否认了努力的全过程,可能只是别人努力的方向错了。就像一次面试,可能你准备了很久,结果面试官就是比较奇葩,一直问没有学习到的领域或知识点,然后有人凭一个挂掉的结果就直接给你扣了一个“躺平”的帽子,觉得挂掉是你不够努力,您心里滋味如何?再说点近点的,我也是od,多少同事深夜无偿加班,涨过一分工资吗?多少外包的技术大牛因为学历被困在外包,连od都进不去,这些人难道不努力吗?只是限制与生活、公司制度等等之类的无奈罢了。说到努力,又想到李家琦79元眉笔事件,这么多年有没有认真工作?有没有涨工资?他嘴里说出来是那么的理所当然,打工牛马都知道“任劳任怨”,“认真工作”真能涨工资?只干活不发声就等着被摘果子吧,企业里永远都是“汇报杰出者”升的最快(当然不是所有企业),这种事情相信段哥包括我甚至大部分od都经历过。最近辞职回老家,和老爸散步每次他都会感慨街上的蔬菜小贩多不容易,他们晚上就窝在那种三轮小货车的驾驶室里,腿都伸不直,我们这里晚上零下了,只盖一条薄毛毯,始终舍不得住我们镇上几十块的酒店,因为一车蔬菜就赚几百块顶多一千而且要卖好久,这样的例子还有太多了。这种芸芸众生可能辛苦了一天之后,打开手机看到网上的凡尔赛发言,跟风喷了几句发泄情绪,我觉得这种人不应该扣上“躺平”的帽子。我觉得大部分正常人都是努力的,或者曾经努力过,但世界上有太多努力解决不了的无奈了,甚至说你都没有那个努力的机会,不过正因如此,才显得坚持不懈的努力奋斗之人的难得可贵,认清生活的真相后仍然热爱生活,敢于直面现实的淋漓。
段段STEADY觉醒与突...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务