<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ES2018</title>
	<atom:link href="https://www.hu365.dev/blog/tag/es2018/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.hu365.dev</link>
	<description>Justin Woo（吴晓虎）的个人博客，生命不息，学习不止</description>
	<lastBuildDate>Sun, 18 Feb 2024 01:35:05 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.3</generator>

<image>
	<url>https://www.hu365.dev/wp-content/uploads/2022/10/cropped-logo-正矩形.blue_-32x32.png</url>
	<title>ES2018</title>
	<link>https://www.hu365.dev</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ES6+新增与修改归纳（2015-2018）</title>
		<link>https://www.hu365.dev/blog/2022/06/63/</link>
		
		<dc:creator><![CDATA[Justin]]></dc:creator>
		<pubDate>Wed, 15 Jun 2022 12:06:00 +0000</pubDate>
				<category><![CDATA[前端笔记]]></category>
		<category><![CDATA[ES2015]]></category>
		<category><![CDATA[ES2016]]></category>
		<category><![CDATA[ES2017]]></category>
		<category><![CDATA[ES2018]]></category>
		<category><![CDATA[JAVASCRIPT]]></category>
		<guid isPermaLink="false">https://www.hu365.dev/?p=63</guid>

					<description><![CDATA[文章按年份事件顺序进行统计，主要参考资料： 最新浏览器主版本，不含更新版本 Chrome/Edge/Opera 为 Blink 内核；Firefox 为 Gecko 内核；Safari/IOS 为 WebKit 内核本文目前主要讨论PC浏览器兼容 一：ES20 <a href="https://www.hu365.dev/blog/2022/06/63/" class="cosmoswp-btn">阅读更多</a>]]></description>
										<content:encoded><![CDATA[
<p>文章按年份事件顺序进行统计，主要参考资料：</p>



<ol>
<li><a href="http://kangax.github.io/compat-table/es6/">ECMAScript 6 compatibility table (kangax.github.io)</a></li>



<li><a href="https://developer.mozilla.org/en-US/">MDN Web Docs (mozilla.org)</a></li>
</ol>



<p>最新浏览器主版本，不含更新版本</p>



<ul>
<li>Chrome：104：2022-08-02</li>



<li>Edge：104：2022-08-05</li>



<li>Firefox：103：2022-07-26</li>



<li>Safari：15.6：2022-07-20</li>



<li>Opera：[Desktop] 89：2022-07-07；[Mobile] 69：2022-05-12</li>
</ul>



<p>Chrome/Edge/Opera 为 Blink 内核；Firefox 为 Gecko 内核；Safari/IOS 为 WebKit 内核<br>本文目前主要讨论PC浏览器兼容</p>



<h2 class="wp-block-heading" id="es-2015">一：ES2015</h2>



<p>鉴于ES6新增属性太多，这里只归纳几个</p>



<h3 class="wp-block-heading">1.1：尾调用优化（Tail Call Optimization/Proper Tail Calls）</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center">❌</td><td class="has-text-align-center" data-align="center">❌</td><td class="has-text-align-center" data-align="center">❌</td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">10+</mark></td><td class="has-text-align-center" data-align="center">❌</td><td class="has-text-align-center" data-align="center">❌</td></tr><tr><td class="has-text-align-center" data-align="center">➖</td><td class="has-text-align-center" data-align="center">➖</td><td class="has-text-align-center" data-align="center">➖</td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2016-09</mark></td><td class="has-text-align-center" data-align="center">➖</td><td class="has-text-align-center" data-align="center">➖</td></tr></tbody></table></figure>



<p>这个伴随ES6就被谈及很多的一个优化；不过很可惜，到目前为止仍只有 Safari 一家实现了该优化，其他几家在加入该优化过程中遇到各种问题，甚至之后很长一段时间都不会有什么积极的更新了；相关故事可以读读：</p>



<ul>
<li><a href="https://stackoverflow.com/a/54721813/9728145">Tail Call Optimization implementation in Javascript Engines &#8211; Stack Overflow</a></li>



<li><a href="https://world.hey.com/mgmarlow/what-happened-to-proper-tail-calls-in-javascript-5494c256">What happened to proper tail calls in JavaScript?</a></li>
</ul>



<h3 class="wp-block-heading">1.2：二进制数/八进制数（Binary Integer Literal/Octal Integer Literal<strong>）</strong></h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">41+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">12+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">25+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">9+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">28+</mark></td><td class="has-text-align-center" data-align="center">✅</td></tr><tr><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2016-05</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2016-0</mark>7</td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2013-09</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2015-10</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2015-05</mark></td><td class="has-text-align-center" data-align="center"><strong><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">➖</mark></strong></td></tr></tbody></table></figure>



<p>二进制数：以 0b/0B开头，后面接数字0-1<br>八进制数：以 0o/0O开头，后面接数字0-7；ES5非严格模式支持前缀0的八进制表示法，ES6相当于规范这几种表示法，和十六进制表示法一样<br>十六进制：以 0x/0X 开头，后面接数字0-9/a-f/A-F</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="dracula" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 二进制
0b1 === 1 &amp;&amp; 0B1 === 1;
0b10 === 2 &amp;&amp; 0B10 === 2;
Number(0b1) === 1 &amp;&amp; Number(0B10) === 2;
// 八进制
0o1 === 1 &amp;&amp; 0O1 === 1;
0o10 === 8 &amp;&amp; 0O10 === 8;
Number(0o1) === 1 &amp;&amp; Number(0o10) === 8;
// 十六进制
0x1 === 1 &amp;&amp; 0X1 === 1;
0x10 === 16 &amp;&amp; 0X10 === 16;
Number(0x1) === 1 &amp;&amp; Number(0X10) === 16;</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Grammar_and_types#%E6%95%B0%E5%AD%97%E5%AD%97%E9%9D%A2%E9%87%8F">语法和数据类型 &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">1.3：正则修饰符：y、u</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">49+/50+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">13+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">3+/46+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">10+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">36+/37+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">36+/37+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">16-03/16-04</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2015-11</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">08-06/16-04</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2016-09</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">16-03/16-05</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">16-03/16-06</mark></mark></td></tr></tbody></table></figure>



<p><code>y</code>：<code>sticky</code> 粘性标志，下一次匹配一定在&nbsp;<code>lastIndex</code>&nbsp;位置开始；<code>RegExp.prototype.sticky</code> 只读属性判断是否启用 <code>y</code> 标志<br><code>u</code>：<code>unicode</code> 相关特性；<code>RegExp.prototype.unicode<code> </code></code>只读属性判断是否启用 <code>u</code> 标志</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">const text = '123 456';
const regY = /\d/y;
const regG = /\d/g;
let result;
// 打印3次，在匹配完‘3’之后，lastIndex 为3，\s（空格）未匹配成功，直接结束
while (result = regY.exec("123 456")) {
    console.log(result, regY.lastIndex);
}
// 打印6次，lastIndex 为 3 时未匹配成功，则 lastIndex + 1 继续匹配，直到全部匹配完
while (result = regG.exec("123 456")) {
    console.log(result, regG.lastIndex);
}</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp#%E4%BD%BF%E7%94%A8%E5%B8%A6%E6%9C%89_sticky_%E6%A0%87%E5%BF%97%E7%9A%84%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F">RegExp(正则表达式) &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">1.4：Reflect</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">49+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">12+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">42+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">10+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">36+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">36+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2016-03</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2015-07</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2015-11</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2016-09</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2016-03</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2016-03</mark></td></tr></tbody></table></figure>



<p><code>Reflect</code>&nbsp;对象是一个内置对象，提供拦截<code>JavaScript</code>操作的方法；其所有属性和方法都是静态的</p>



<p>静态方法参数都有类型要求，类型不匹配会报类型错误<code>TypeError</code>；与之相类似的<code>Object</code>方法则会进行强制转换，部分方法在<code>ES5</code>会报错，在<code>ES6</code>被修改为强制转换：<code>Object.keys</code>、<code>Object.getOwnPropertyNames</code>、<code>Object.assign</code>等</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Reflect.apply(); // Function.prototype.apply() 
Reflect.construct(); // new 构造函数
Reflect.has(); // name in Object
Reflect.getPrototypeOf(); // Object.getPrototypeOf()
                          // ES6之前不会进行强制转换，之后会
Reflect.isExtensible(); // Object.isExtensible()

// @return {Boolean} 操作是否成功
Reflect.defineProperty(); // Object.defineProperty() 返回对象
Reflect.deleteProperty(); // delete Objet[name] 返回 true
                          // 除非 configurable=false（非严格模式）
Reflect.get(); // Objet[name]
Reflect.set(); // Objet[name] = value
Reflect.preventExtensions(); // Object.preventExtensions() 返回对象
Reflect.setPrototypeOf(); // Object.setPrototypeOf() 返回对象

// @return {Object|undefined} 属性描述符
Reflect.getOwnPropertyDescriptor(); // Objet.getOwnPropertyDescriptor()

// @return {(Symbol|String)[]} 属性名列表，包含不可枚举属性、Symbol属性
Reflect.ownKeys(); // Object.keys 不含不可枚举、Symbol
                   // Object.getOwnPropertyNames 含不可枚举
                   // Object.getOwnPropertySymbols 含不可枚举</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect">Reflect &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">1.5：内置Symbol（Well-known Symbols）</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">73+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">79+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">78+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">14+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">60+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">52+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2019-03</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2020-01</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2020-06</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2020-09</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2019-04</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2019-05</mark></td></tr></tbody></table><figcaption class="wp-element-caption">因为每个属性值被添加到浏览器的时间不同，此处浏览器版本为最近一次添加属性的版本</figcaption></figure>



<p>内置Symbol，通常被用作对象或类的属性键，对应的值用作规范算法的扩展、或者重构内部语言行为；该重构行为改仅针对修改的对象或类生效，不会修改全局的默认方法</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 迭代器：Symbol.iterator
const arr = [1,2,3];
arr[Symbol.iterator] = function* (...params) {
    for (let i=0;i&lt;arr.length;i++) {
        yield 2*arr[i];
    }
}
console.log(arr); // Array [1, 2, 3]
console.log([...arr]); // Array [2, 4, 6]

// 字符串替换、拆分：Symbol.replace、Symbol.split
const obj = {
    [Symbol.replace]: (origin, replaceTo)=> {
        return `__${origin}_${replaceTo}__`;
    },
    [Symbol.split]: (origin, limit)=> {
        return `${Array(2).fill(origin)}`;
    },
}
const str = 'test';
console.log(str.replace(obj, 'to')); // "__test_to__"
console.log(str.split(obj, 5)); // "test,test"</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol#%E4%BC%97%E6%89%80%E5%91%A8%E7%9F%A5%E7%9A%84_symbols">Symbol &#8211; JavaScript | MDN (mozilla.org)</a></li>



<li><a href="https://262.ecma-international.org/6.0/#sec-well-known-symbols">ECMAScript 2015 Language Specification – ECMA-262 6th Edition (ecma-international.org)</a></li>
</ul>



<h3 class="wp-block-heading">1.6：Array.prototype.splice</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">1+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">12+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">1+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">1+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">4+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">10.1+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2008-12</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2015-07</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2004-11</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2003-06</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2000-06</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2010-11</mark></td></tr></tbody></table></figure>



<p>这确实是ES6新标准，但是各大浏览器其实早就加入了该实现方法，新标准只是给他一个名分而已</p>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/splice">Array.prototype.splice() &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">1.7：Number.EPSILON</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">34+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">12+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">25+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">9+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">21+</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #008000;">21+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2014-04</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2015-07</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2013-10</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2015-09</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2014-05</mark></td><td class="has-text-align-center" data-align="center"><mark class="has-inline-color" style="background-color: rgba(0, 0, 0, 0); color: #443d66;">2014-04</mark></td></tr></tbody></table></figure>



<p>表示 1 与 Number 类型可表示的大于 1 的最小的浮点数之间的差值，可理解为：最小浮点数</p>



<p><br>可以用来判断浮点数之间的计算值比较，差值 <code>&lt; Number.EPSILON</code> 即认定为相等：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">const x = 0.1, y = 0.2, z = 0.3;
const isEqual = (Math.abs(x + y - z) &lt; Number.EPSILON);</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/EPSILON">Number.EPSILON &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h2 class="wp-block-heading">二：ES2016</h2>



<h3 class="wp-block-heading">2.1：幂运算（**/**=）</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">52+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">14+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">52+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">10.1+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">39+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">41+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-07</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-08</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-03</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-03</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-08</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-10</mark></td></tr></tbody></table></figure>



<p>求幂，等效于<code>Math.pow</code>，也接受<code>BigInts</code>作为参数</p>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Exponentiation_assignment#browser_compatibility">Exponentiation assignment (**=) &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">2.2：Array.prototype.includes</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">47+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">14+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">43+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">9+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">34+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">34+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2015-12</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-08</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2015-12</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2015-09</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2015-12</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2015-12</mark></td></tr></tbody></table></figure>



<p><code>arr.includes(valueToFind[, fromIndex])</code>接受两个参数；</p>



<p>第一个参数不传，则默认为<code>undefined</code><br>第二个参数为查找开始的索引值，为可选参数：</p>



<ul>
<li><code>fromIndex &gt;= 0 &amp;&amp; fromIndex &lt;= arr.length - 1</code>：正常查找</li>



<li><code>fromIndex &gt; arr.length - 1</code>：返回<code>false</code></li>



<li><code>fromIndex &lt; 0</code>：计算<code>fromIndex = Math.max(0, fromIndex + arr.length)</code>之后再判断</li>
</ul>



<p><code>includes()</code>&nbsp;有意设计为通用方法，可以被用于其他类型（如类数组对象）的对象，包括<code>querySelectorAll</code>、<code>Object.keys</code>、<code>map.keys</code>等</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[].includes(); // false
[undefined].includes(); // true
[1,].includes(); // false
[1,,].includes(); // true
Array(2).includes(); // true

// 其他类型
[].includes.call(1, 1); // 数字，false
[].includes.call(true, true); // 布尔，false
[].includes.call(Symbol(1), 1); // Symbol，false
[].includes.call(BigInt(1), 1); // BigInt，false
[].includes.call(()=>{}, 1); // Function，false
[].includes.call(/\d/, 1); // RegExp，false
[].includes.call(null, null); // null，TypeError
[].includes.call(undefined, undefined); // undefined，TypeError
</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/includes">Array.prototype.includes() &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h2 class="wp-block-heading">三：ES2017</h2>



<h3 class="wp-block-heading">3.1：对象取值（values/entries）</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">54+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">14+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">47+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">10.1+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">41+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">41+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-10</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-08</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-06</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-03</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-10</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-10</mark></td></tr></tbody></table></figure>



<p><code>Object.<code>values</code></code>对象自身的所有可枚举属性值的数组；顺序与使用<code>for...in</code>循环的顺序相同<br><code>Object.entries</code>对象自身可枚举属性的键值对数组；顺序与使用<code>for...in</code>循环的顺序相同</p>



<p><code>Object.keys</code>方法在浏览器中很早就实现了，直到<code>ES2015</code>成为标准；然后时隔两年，<code>Object.values</code>才成为新标准，浏览器也是跟随标准才实现该方法；所以对于一些较老的浏览器来说，很可能实现了<code>Object.keys</code>而没有实现<code>Object.values</code>/<code>Object.entries</code></p>



<p><code>Object.entries</code>最常用的作用估计就是转换成map了</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">const obj = { foo: "bar", baz: 42 };
const map = new Map(Object.entries(obj));
console.log(map) // Map(2) {'foo' => 'bar', 'baz' => 42}</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/values">Object.values() &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/entries">Object.entries() &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">3.2：属性描述符（getOwnPropertyDescriptors）</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">54+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">14+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">47+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">10.1+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">41+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">41+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-10</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-08</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-06</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-03</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-10</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-10</mark></td></tr></tbody></table></figure>



<p>对象自身所有属性的描述符，没有任何自身属性，则返回空对象<br>主要用途：</p>



<ol>
<li>浅拷贝</li>
</ol>



<p>实现拷贝对象时，也拷贝它的原型、属性特性</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Object.create(
    Object.getPrototypeOf(obj),
    Object.getOwnPropertyDescriptors(obj)
);</pre>



<ol start="2">
<li>创建子类</li>
</ol>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 传统写法的另一种实现
function superclass() {}
superclass.prototype = {
    // 在这里定义方法和属性
};
function subclass() {}
subclass.prototype = Object.create(superclass.prototype, Object.getOwnPropertyDescriptors({
    // 在这里定义方法和属性
}));</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors">Object.getOwnPropertyDescriptors() &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">3.3：字符串填充（padStart/padEnd）</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">57+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">15+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">48+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">10+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">44+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">43+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-03</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-04</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-08</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-09</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-03</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-09</mark></td></tr></tbody></table></figure>



<ul>
<li><code>str.padStart(targetLength [, padString])</code></li>
</ul>



<ul start="2">
<li><code>str.padEnd(targetLength [, padString])</code></li>
</ul>



<p><code>targetLength</code>为目标长度，只有大于字符本身长度时，才会执行填充，小于时是直接返回原字符<br><code>padString</code>为填充字符串，长度够时反复填充，长度不够时优先保留左侧字符</p>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/padStart">String.prototype.padStart() &#8211; JavaScript | MDN (mozilla.org)</a></li>



<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/padEnd">String.prototype.padEnd() &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">3.4：函数尾逗号（trailing/final commas）</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">58+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">14+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">52+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">10+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">45+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">43+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-04</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-08</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-03</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-09</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-05</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-09</mark></td></tr></tbody></table></figure>



<p>针对函数参数中的尾逗号，在函数定义、函数调用中，最后一个参数后面可追加逗号：<code>,</code><br>在没有参数、结构参数时，不能添加尾逗号：</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 合法的写法
function f(p,) {}
(p,) => {};
f(p,);
Math.max(10, 20,);

// 不合法的写法
function f(,) {} // SyntaxError: missing formal parameter
f(,);            // SyntaxError: expected expression, got ','
(...p,) => {}    // SyntaxError: expected closing parenthesis, got ','</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Trailing_commas#%E5%87%BD%E6%95%B0%E4%B8%AD%E7%9A%84%E5%B0%BE%E5%90%8E%E9%80%97%E5%8F%B7">尾后逗号 &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">3.5：异步函数（async/await）</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">55+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">15+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">52+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">10+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">42+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">42+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-12</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-04</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-03</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-09</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-12</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-01</mark></td></tr></tbody></table></figure>



<p><code>async</code>和<code>await</code>关键字让我们可以用一种更简洁的方式写出基于<a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise"><code>Promise</code></a>的异步行为，而无需刻意地链式调用<code>promise</code></p>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/async_function">async 函数 &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">3.6：共享内存（SharedArrayBuffer/Atomics）</h3>



<p><code>SharedArrayBuffer</code></p>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">68+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">79+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">78+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">10+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">55+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">63+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-07</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-01</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-06</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2016-09</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-08</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2021-04</mark></td></tr></tbody></table><figcaption class="wp-element-caption">为应对幽灵漏洞，所有主流浏览器均默认于 2018 年 1 月 5 日禁用 SharedArrayBuffer；<br>在 2020 年，一种新的、安全的方法已经标准化，以重新启用 SharedArrayBuffer</figcaption></figure>



<p><code>Atomics</code></p>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center">①<mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">87+</mark></td><td class="has-text-align-center" data-align="center">①<mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">87+</mark></td><td class="has-text-align-center" data-align="center">②<mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">79+</mark></td><td class="has-text-align-center" data-align="center">①②<mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">15.2+</mark></td><td class="has-text-align-center" data-align="center">①<mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">75+</mark></td><td class="has-text-align-center" data-align="center">①<mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">63+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-11</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-11</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-07</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2021-12</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2021-03</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2021-04</mark></td></tr></tbody></table><figcaption class="wp-element-caption">①：仅支持<code>SharedArrayBuffer</code>对象操作；②：不支持<code>waitAsync</code>方法</figcaption></figure>



<p><code>SharedArrayBuffer</code>对象用来表示一个通用的、固定长度的原始二进制数据缓冲区，类似于<code>ArrayBuffer</code>对象，它们都可以用来在共享内存（shared memory）上创建视图<br><code>Atomics</code>对象提供了一组静态方法对<code>SharedArrayBuffer</code>和<code>ArrayBuffer</code>对象进行原子操作</p>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer">SharedArrayBuffer &#8211; JavaScript | MDN (mozilla.org)</a></li>



<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Atomics">Atomics &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h2 class="wp-block-heading">四：ES2018</h2>



<h3 class="wp-block-heading">4.1：对象的剩余/展开属性（Object Rest/Spread Properties）</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">60+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">79+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">55+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">11.1+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">47+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">44+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-07</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-01</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-08</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-04</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-08</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-12</mark></td></tr></tbody></table></figure>



<p>属性拓展符在对象中的拓展；在某些浏览器版本中即使支持拓展符<code>...</code>，但不一定支持在对象中使用</p>



<p>可用来实现对象的浅拷贝和合并，与<code><code>Object.assign()</code></code>作用类似，但<code>Object.assign()</code>函数会触发 <code>setters</code>，而展开语法则不会</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 剩余属性
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 }</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_syntax#%E6%9E%84%E9%80%A0%E5%AD%97%E9%9D%A2%E9%87%8F%E5%AF%B9%E8%B1%A1%E6%97%B6%E4%BD%BF%E7%94%A8%E5%B1%95%E5%BC%80%E8%AF%AD%E6%B3%95">展开语法 &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">4.2：Promise.prototype.finally</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">63+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">18+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">58+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">11.1+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">50+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">45+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-12</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-10</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-01</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-04</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-01</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-05</mark></td></tr></tbody></table></figure>



<p>在<code>promise</code>结束时，无论结果是<code>fulfilled</code>或者是<code>rejected</code>，都会执行指定的回调函数</p>



<p>此方法是新增的方法，和<code>Promise.prototype.then</code>、<code>Promise.prototype.catch</code>拥有不同的兼容性表现，某些浏览器版本中存在兼容性问题</p>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally">Promise.prototype.finally() &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">4.3：正则修饰符：s</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">62+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">79+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">78+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">11.1+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">49+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">46+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-10</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-01</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-06</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-04</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-11</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-05</mark></td></tr></tbody></table></figure>



<p>启用<code>dotAll</code>模式，特殊字符<code>.</code>可匹配行终结符（换行符），相当于匹配“任意单个字符”：</p>



<ul>
<li>U+000A 换行符（<code>\n</code>）</li>



<li>U+000D 回车符（<code>\r</code>）</li>



<li>U+2028 行分隔符（line separator）</li>



<li>U+2029 段分隔符（paragraph separator）</li>
</ul>



<p><code>RegExp.prototype.dotAll</code>只读属性用来判断是否启用了<code>s</code>标志</p>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp/dotAll">RegExp.prototype.dotAll &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">4.4：命名分组捕获（Named capture groups）</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">64+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">79+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">78+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">11.1+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">51+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">47+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-01</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-01</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-06</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-04</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-02</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-07</mark></td></tr></tbody></table></figure>



<p>以前的分组捕获都是用索引去取值，用<code>result[0]</code>、<code>result[2]</code>的形式取值，很多场景都分不清它们是什么含义，于是就有了命名捕获分组；这真是贴心的更新，不过需要考虑老浏览器兼容性</p>



<ul>
<li><strong>命名（<code>(?&lt;name&gt;...)</code>）与取值（属性<code>groups</code>）</strong></li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 获取年月日的匹配
let re = /(?&lt;year>\d{4})-(?&lt;month>\d{2})-(?&lt;day>\d{2})/u;
let result = re.exec('2015-01-02');
// 以前的取值
let date = result[0];   // '2015-01-02'
let year = result[1];   // '2015'
let month = result[2];  // '01'
let day = result[3];    // '02'
// 命名取值
let date = result[0];             // '2015-01-02'
let year = result.groups.year;    // '2015'
let month = result.groups.month;  // '01'
let day = result.groups.day;      // '02'
// 也可以直接结构取值
let {groups: {year, month, day}} = re.exec('2015-01-02');</pre>



<ul start="2">
<li><strong>命名引用（<code>\k&lt;name&gt;</code>）</strong></li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// (?&lt;half>.*)：匹配任意字符，命名为half
// \k&lt;half>：引用命名为half的匹配，即与前面是相同匹配
// 匹配结果就是 ABA 的字符串模式
let duplicate = /^(?&lt;half>.*).\k&lt;half>$/;
duplicate.test('a*b');    // false
duplicate.test('a_a');    // true
duplicate.test('ab-ab');  // true
duplicate.test('aaaa');   // false
duplicate.test('aaaaa');  // true</pre>



<ul start="3">
<li><strong><code>String.prototype.replace</code>中的使用</strong></li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// 把日期格式 yyyy-mm-dd 替换为 dd/mm/yyy
let str = '2015-02-01';
let re = /(?&lt;year>\d{4})-(?&lt;month>\d{2})-(?&lt;day>\d{2})/;
// 以往的写法
let result = str.replace(re, '$3/$2/$1'); // '01/02/2015'
// 命名分组写法
let result = str.replace(re, '$&lt;day>/$&lt;month>/$&lt;year>'); // '01/02/2015'</pre>



<ul>
<li><a href="https://github.com/tc39/proposal-regexp-named-groups">tc39/proposal-regexp-named-groups: Named capture groups for JavaScript RegExps (github.com)</a></li>
</ul>



<h3 class="wp-block-heading">4.5：后行断言（<strong>Lookbehind assertion</strong>）</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">62+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">79+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">78+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">❌</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">49+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">46+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-10</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-01</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-06</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">➖</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-11</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-05</mark></td></tr></tbody></table></figure>



<p><code>(?&lt;=y)x</code>仅当&#8217;x&#8217;前面是&#8217;y&#8217;时，匹配&#8217;x&#8217;，这种叫做后行断言<br><code>(?&lt;!<em>y</em>)<em>x</em></code>仅当&#8217;x&#8217;前面不是&#8217;y&#8217;时，匹配&#8217;x&#8217;，这被称为反向否定查找</p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">let str1 = 'JackSprat';
let str2 = 'TomSprat';
let re1 = /(?&lt;=Jack)Sprat/;  // 匹配 JackSprat 中的 Sprat
let re2 = /(?&lt;!=Jack)Sprat/; // 匹配 不是 JackSprat 中的 Sprat
re1.exec(str1); // ['Sprat', index: 4, input: 'JackSprat', groups: undefined]
re1.exec(str2); // null
re2.exec(str1); // ['Sprat', index: 4, input: 'JackSprat', groups: undefined]
re2.exec(str2); // ['Sprat', index: 3, input: 'TomSprat', groups: undefined]</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions#special-lookahead">正则表达式 &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">4.6：Unicode转义捕获（Unicode Property Escapes）</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">64+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">79+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">78+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">11.1</mark>+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">51+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">47+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-01</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-01</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-06</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-0</mark></mark>4</td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-02</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-0</mark>7</td></tr></tbody></table></figure>



<p>根据<code>Unicode</code>属性，用来匹配表情、标点符号、字母、甚至特定语言或文字等。同一符号可以拥有多种<code>Unicode</code>属性，属性则有<code>binary</code>(&#8220;<code>boolean-like</code>&#8220;)和<code>non-binary</code>之分<br>使用时必须依靠<code>\u</code>标识，使用转义字符<code>\p{...}</code> 和 <code>\P{...}</code></p>



<pre class="EnlighterJSRAW" data-enlighter-language="js" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// Non-binary 属性
\p{Unicode 属性值}
\p{Unicode 属性名=Unicode 属性值}
// Binary and non-binary 属性
\p{UnicodeBinary 属性名}
// \P 为 \p 取反
\P{Unicode 属性值}
\P{UnicodeBinary 属性名}

let sentence = 'A ticket to 大阪 costs ¥2000 👌.';
let regexpEmojiPresentation = /\p{Emoji_Presentation}/gu;
sentence.match(regexpEmojiPresentation);  // ["👌"]

let regexpNonLatin = /\P{Script_Extensions=Latin}+/gu;
sentence.match(regexpNonLatin);  // [" ", " ", " 大阪 ", " ¥2000 👌."]

let regexpCurrencyOrPunctuation = /\p{Sc}|\p{P}/gu;
sentence.match(regexpCurrencyOrPunctuation);  // ["¥", "."]
</pre>



<ul>
<li><a href="https://github.com/tc39/proposal-regexp-unicode-property-escapes">tc39/proposal-regexp-unicode-property-escapes. (github.com)</a></li>
</ul>



<h3 class="wp-block-heading">4.7：Function.prototype.toString</h3>



<figure class="wp-block-table is-style-regular has-medium-font-size"><table class="has-fixed-layout"><tbody><tr><td class="has-text-align-center" data-align="center">Chrome</td><td class="has-text-align-center" data-align="center">Edge</td><td class="has-text-align-center" data-align="center">Firefox</td><td class="has-text-align-center" data-align="center">Safari</td><td class="has-text-align-center" data-align="center">Opera</td><td class="has-text-align-center" data-align="center">Opera Mobile</td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">66+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">79+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">54+</mark></td><td class="has-text-align-center" data-align="center">❌</td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">53+</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">47+</mark></td></tr><tr><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-04</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-01</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2017-06</mark></td><td class="has-text-align-center" data-align="center">➖</td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-05</mark></td><td class="has-text-align-center" data-align="center"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2018-07</mark></td></tr></tbody></table></figure>



<p>新规范：要求<code>Function.prototype.toString</code>的返回值与声明的源代码完全现统，包括空格和注释；或者因某种原因，主机没有源代码，则要求返回一个原生函数字符串</p>



<ul>
<li><a href="https://tc39.es/Function-prototype-toString-revision/#proposal-sec-function.prototype.tostring">Function.prototype.toString revision (tc39.es)</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
