ES新特性

optional chaining

本质:语法糖

年份:2020

optional chaining 可选链。主要解决你调一个方法 ,数组,或者对象的某一个属性。发现方法数组,对象不存在。然后会报 Uncaught ReferenceError

原来我们处理的方式


let value = obj ? obj.name:undefined;

现在我们有了可选链之后的解决办法:


let value = lili?.name;
let value1 = arr?.[3];
let value2 = fun?.(...arg);

不仅对对象可用,数组方法都可以同样适用。

Nullish coalescing Operator

本质:语法糖

年份:2020

Nullish coalescing Operator 空位合并运算符。主要解决原本的为空默认值。

原本写法


let a = lii || "aaa";

新写法


let a = lii ?? "aaa";

String.prototype.matchAll

年份:2020

String.prototype.matchAll 可以获取一个字符串正则匹配出的所有值。这简化了之前要匹配所有值的方法。值得注意的是matchAll返回的并不是一个数组,而是一个迭代器。


[...'-a-a-a'.matchAll(/-(a)/ug)]
// [["-a", "a", index: 0, input: "-a-a-a", groups: undefined],["-a", "a", index: 2, input: "-a-a-a", groups: undefined],["-a", "a", index: 4, input: "-a-a-a", groups: undefined]]


import()

年份:2020

import() 语句看上是一个函数,实际上它并不是一个函数,而是一个特殊的语句。它为我们提供了一种动态引入js模块的方式,无论在浏览器当中还是在node当中都同样适用。

值得注意的是它返回的是一个promise对象,你同样可以对他使用async/await。

const main = document.querySelector("main");
  for (const link of document.querySelectorAll("nav > a")) {
    link.addEventListener("click", e => {
      e.preventDefault();

      import(`./section-modules/${link.dataset.entryModule}.js`)
        .then(module => {
          module.loadPageInto(main);
        })
        .catch(err => {
          main.textContent = err.message;
        });
    });
  }

BigInt

BigInt是为了解决JS当中最大的安全数字是2^53,当你的计算超出了这个界限他的表现就会变得很奇怪。

const max = Number.MAX_SAFE_INTEGER;
// 9007199254740991
console.log(max + 1); // 9007199254740992
console.log(max + 2); // 9007199254740992
console.log(max + 3); // 9007199254740994
console.log(Math.pow(2, 53) == Math.pow(2, 53) + 1); // true

因此我们引入了BigInt,来解决这个问题。

const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER);
// ↪ 9007199254740991n

const maxPlusOne = previousMaxSafe + 1n;
// ↪ 9007199254740992n

const theFuture = previousMaxSafe + 2n;
// ↪ 9007199254740993n, this works now!

const multi = previousMaxSafe * 2n;
// ↪ 18014398509481982n

const subtr = multi – 10n;
// ↪ 18014398509481972n

const mod = multi % 10n;
// ↪ 2n

const bigN = 2n ** 54n;
// ↪ 18014398509481984n

bigN * -1n
// ↪ –18014398509481984n

值得注意的是,当你的数据是BigInt的时候。你进行计算时,数字都得是BigInt类型的。

Promise.allSettled

年份:2020

Promise.allSettled(arr) 这个方法是为了更加方便的进行debug来看每一个Promise的执行结果。

Array.prototype.{flat,flatmap}

年份:2019

Array.prototype.flat([depth]) 将数组平整成一维的数组,接受一个参数depth,决定平整的层数,默认只平整一层。接受Infinity关键词表示无限深度。

Array.prototype.flatmap([callback],thisArg) 将数组平整后再对每个数调用callback函数(类似map方法)。
后面的thisArg暂时不知道啥意思。

注意:他们返回的都是一个新的数组,原数组不会被改变。数组中空的位置会被跳过。

String.prototype.{trimStart,trimEnd}

年份:2019

去除开始/结束位置的空白字符串。返回新的字符串。

let str = "   ssss   ";
let start = str.trimStart(); // "ssss   ";
let end = str.trimEnd();// "   ssss";

正则匹配s(匹配所有)标记

年份:2018

正则匹配中.代表匹配所有字符,但是在之前当中它无法匹配某些换行符。因此提出一个新的s模式,表示让.可以匹配所有字符。(之前一直使用[\s|\S]来代替)

/foo.bar/.test('foo\nbar');
// → false

/foo[^]bar/.test('foo\nbar');
// → true

正则匹配命名捕捉组

年份:2018

原本正则匹配的组都只能通过数组序号来访问,这让你捕获到的组难以使用,也难以理解。因此通过增加为捕获组增加命名,可以让正则匹配更易理解也更方便重构。

let re = /(\d{4})-(\d{2})-(\d{2})/u;
let result = re.exec('2020-01-02');
// ['2020-01-02','2020','01','02',index: 0,input: '2020-01-02',]
let re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
let result = re.exec('2015-01-02');
// [
  '2015-01-02',
  '2015',
  '01',
  '02',
  index: 0,
  input: '2015-01-02',
  groups: [Object: null prototype] { year: '2015', month: '01', day: '02' }
]

可以通过结构的方式来获取各命名补货组。

反向引用

通过命名后的捕获组反向引用。可以在正则表达式中通过\k<name>构造访问已命名组。

let duplicate = /^(?<half>.*).\k<half>$/u;
duplicate.test('a*b'); // false
duplicate.test('a*a'); // true

命名引用也可以与编号引用同时使用

let triplicate = /^(?<part>.*).\k<part>.\1$/u;
triplicate.test('a*a*a'); // true
triplicate.test('a*a*b'); // false

替换对象

命名捕获组可以传递给String.prototype.replace方法,如果这个值是一个String。那么可以在其中使用$<name>来进行替换。

let re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/u;
let result = '2015-01-02'.replace(re, '$<day>/$<month>/$<year>');
// result === '02/01/2015'

对象解构和扩展

年份:2018

允许通过...的语法将解构时剩下的属性解构进一个对象。同时也允许通过...将对象扩展到一个对象当中。

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
x; // 1
y; // 2
z; // { a: 3, b: 4 }

let n = { x, y, ...z };
n; // { x: 1, y: 2, a: 3, b: 4 }

正则表达式中的Unicode属性转义

年份:2018

Unicode标准为每个符号分配各种属性和属性值。例如,要获得仅在希腊语脚本中使用的符号集,可以在Unicode数据库中搜索脚本属性设置为希腊语的符号。但是之前在ECMAScript当中我们是没法做这样的匹配的。

只能够通过一些库去解决这个问题,但是引入第三方库会带来一些新的问题。比如,引入大小过大,运行时解析对效率的损失。编译器解决使得难以阅读等等。

因此添加表单\p{}和\p{}的Unicode属性转义。Unicode属性转义是一种新的转义序列,可以用在设置了u标志的正则表达式中。

const regexGreekSymbol = /\p{Script=Greek}/u;
regexGreekSymbol.test('π');
// → true
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容