<?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>ES2022</title>
	<atom:link href="https://www.hu365.dev/blog/tag/es2022/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.hu365.dev</link>
	<description>Justin Woo（吴晓虎）的个人博客，生命不息，学习不止</description>
	<lastBuildDate>Sun, 18 Feb 2024 01:35:00 +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>ES2022</title>
	<link>https://www.hu365.dev</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ES6+新增与修改归纳（2019-2022）</title>
		<link>https://www.hu365.dev/blog/2022/07/98/</link>
		
		<dc:creator><![CDATA[Justin]]></dc:creator>
		<pubDate>Sun, 31 Jul 2022 11:10:54 +0000</pubDate>
				<category><![CDATA[前端笔记]]></category>
		<category><![CDATA[ES2019]]></category>
		<category><![CDATA[ES2020]]></category>
		<category><![CDATA[ES2021]]></category>
		<category><![CDATA[ES2022]]></category>
		<category><![CDATA[JAVASCRIPT]]></category>
		<guid isPermaLink="false">https://www.hu365.dev/?p=98</guid>

					<description><![CDATA[一：ES2019 1.1：Symbol.prototype.description Chrome Edge Firefox Safari Opera Opera Mobile 70+ 79+ 63+ 12.1+ 57+ 49+ 2018-10 2020-01  <a href="https://www.hu365.dev/blog/2022/07/98/" class="cosmoswp-btn">阅读更多</a>]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">一：ES2019</h2>



<h3 class="wp-block-heading">1.1：Symbol.prototype.description</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">70+</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">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">12.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">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">49+</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-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">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">2019-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">2018-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-12</mark></td></tr></tbody></table></figure>



<p>返回<code>Symbol</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="">Symbol('desc').description;        // "desc"
Symbol.iterator.description;       // "Symbol.iterator"
Symbol.for('foo').description;     // "foo"
`${Symbol('foo').description}bar`; // "foobar"</pre>



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



<h3 class="wp-block-heading">1.2：Object.fromEntries</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">73+</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">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">12.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">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">52+</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">2019-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">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">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">2019-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">2019-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">2019-05</mark></td></tr></tbody></table></figure>



<p>把键值对列表转换为一个对象；这个键值对列表可以是<code>Array</code>、<code>Map</code>或者其它实现了可迭代协议（<code>Iteration protocols</code>）的可迭代对象<br>与<code>Object.entries</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 entries = new Map([['foo', 'bar'], ['baz', 42]]);
let newObj = Object.fromEntries(entries);  // { foo: "bar", baz: 42 }
// 与Object.entries互转
let newEntries = Object.entries(newObj);   // [['foo', 'bar'], ['baz', 42]]
newObj = Object.fromEntries(newEntries );  // { foo: "bar", baz: 42 }</pre>



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



<h3 class="wp-block-heading">1.3：删除空格（trimStart/trimEnd/trimLeft/trimRight）</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">61+</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">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">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">2018-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-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-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>trimStart()</code>、<code>trimLeft()</code>：从一个字符串的开头移除空白字符<br><code>trimEnd()</code>、<code>trimRight()</code>：从一个字符串的末端移除空白字符<br><code>trimStart()</code>、<code>trimEnd()</code>为标准名称，<code>trimLeft()</code>、<code>trimRight()</code>为兼容web定义的别名</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 greeting = '   Hello world!   ';
greeting.trimStart();   // 'Hello world!   '
greeting.trimLeft();    // 'Hello world!   '
greeting.trimEnd();     // '   Hello world!'
greeting.trimRight();   // '   Hello world!'
greeting.trim();        // 'Hello world!' ES5的语法，移除两端空白字符</pre>



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



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



<h3 class="wp-block-heading">1.4：Array.prototype.flat/flatMap</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">69+</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">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">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">56+</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></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-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">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">2018-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-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-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-11</mark></td></tr></tbody></table></figure>



<p><code>flat([depth])</code>：按可指定的深度（<code>depth</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 arr1 = [0, 1, 2, [3, 4]];
arr1.flat();   // [0, 1, 2, 3, 4]
const arr2 = [0, 1, 2, [[[3, 4]]]];
arr2.flat();   // [0, 1, 2, [[3, 4]]]
arr2.flat(2);  // [0, 1, 2, [3, 4]]
arr2.flat(3);  // [0, 1, 2, 3, 4]
arr2.flat(4);  // [0, 1, 2, 3, 4]</pre>



<p><code>flatMap()</code>：使用映射函数映射每个元素（等同于<code>map</code>方法），然后将结果压缩成一个新数组（等同于<code>flat(1)</code>，<code>depth</code>始终为<code>1</code>）；可用于增删元素，实现<code>map</code>遍历下的<code>filter</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 arr1 = [1, 2, 3, 4];
arr1.map(x => x * 2);                 // [2, 4, 6, 8]
arr1.flatMap(x => [x * 2]);           // [2, 4, 6, 8]
arr1.flatMap(x => [x * 2, x]);        // [2, 1, 4, 2, 6, 3, 8, 4]
arr1.flatMap(x => x > 2 ? [x] : []);  // [3, 4]</pre>



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



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



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



<h3 class="wp-block-heading">2.1：String.prototype.matchAll</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">73+</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">67+</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">13+</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">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">52+</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">2019-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">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">2019-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">2019-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">2019-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">2019-05</mark></td></tr></tbody></table></figure>



<p>返回一个包含所有匹配正则表达式的结果及分组捕获组的迭代器，该迭代器调用结果耗尽后，需要再次调用方法，获取一个新的迭代器<br>使用时正则表达式需使用<code>g</code>标志，否则抛出<code>TypeError</code><br>其内部做了一个<code>regexp</code>的复制，所以不像<code>exec</code>，<code>lastIndex</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 regexp = RegExp('foo[a-z]*','g');
const str = 'table football, foosball';

// 结果耗尽，迭代器为空
const m1 = str.matchAll(regexp);
Array.from(m1);          // [Array(1), Array(1)]
Array.from(m1);          // []

// 与 exec() 的对比，不用反复取值，直接遍历
let match;
while ((match = regexp.exec(str)) !== null) {
    console.log(match); // ['football', ...] ['foosball', ...]
}
const m2 = str.matchAll(regexp);
for (match of m2) {
    console.log(match); // ['football', ...] ['foosball', ...]
}

// 与 match() 的对比，结果包含分组捕获
const regexp2 = /t(e)(st(\d?))/g;
const str2 = 'test1test2';
str2.match(regexp2); // ['test1', 'test2']
let array = [...str2.matchAll(regexp2)];
array[0];  // ['test1', 'e', 'st1', '1', index: 0, ...]
array[1];  // ['test2', 'e', 'st2', '2', index: 5, ...]</pre>



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



<h3 class="wp-block-heading">2.2：BigInt</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">①67+/76+</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">①68+<mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">/</mark>70+</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">①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">①48+/54+</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">19-05/19-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">19-07/19-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-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-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">18-11/19-10</mark></td></tr></tbody></table><figcaption class="wp-element-caption">①：toLocaleString 方法不支持参数：locales、options</figcaption></figure>



<p>内置对象，它提供了一种方法来表示大于<code>2^53 - 1</code>的整数，这原本是<code>Javascript</code>中可以用<code>Number</code>表示的最大数字（<code>Number.MAX_SAFE_INTEGER</code>），<code>BigInt</code>可以表示任意大的整数</p>



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



<h3 class="wp-block-heading">2.3：Promise.allSettled</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">76+</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">71+</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">13+</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><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></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">2019-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">2019-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">2019-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">2019-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">2019-10</mark></td></tr></tbody></table></figure>



<p>返回一个在所有给定的<code>promise</code>都已经<code>fulfilled</code>或<code>rejected</code>后的<code>promise</code>，并带有一个对象数组，每个对象表示对应的<code>promise</code>结果<br>有多个彼此不依赖的异步任务成功完成时，或者您总是想知道每个<code>promise</code>的结果时，通常使用它<br><code>Promise.all()</code>更适合彼此相互依赖或者在其中任何一个<code>reject</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 promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => {
    setTimeout(reject, 100, 'foo');
});
const promises = [promise1, promise2];

Promise.allSettled(promises)
    .then((results) => results.forEach(result => console.log(result)));
// { status: "fulfilled", value: 3 }
// { status: "rejected", reason: "foo" }

Promise.all(promises)
    .then((results) => console.log(results))
    .catch(console.error);
// foo</pre>



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



<h3 class="wp-block-heading">2.4：globalThis</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">71+</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">65+</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">12.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">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">50+</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-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">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">2019-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">2019-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">2019-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">2019-02</mark></td></tr></tbody></table></figure>



<p>提供一个标准的方式来获取不同环境下的全局<code>this</code>对象，确保可以在有无窗口的各种环境下正常工作，不必担心它的运行环境<br>它既是<code>Web</code>中的<code>window</code>、<code>self</code>或者<code>frames</code>，<code>Web Workers</code>中的<code>self</code>，也是<code>Node.js</code>中的<code>global</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="">globalThis === this &amp;&amp;
globalThis === self &amp;&amp;
globalThis === window;
// true</pre>



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



<h3 class="wp-block-heading">2.5：可选链操作符（?.）</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">80+</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">80+</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">74+</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">13.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">67+</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">57+</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-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">2020-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">2020-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">2020-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">2020-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">2020-03</mark></td></tr></tbody></table></figure>



<p>允许读取位于连接对象链深处的属性的值，而不必明确验证链中的每个引用是否有效<br>引用为空（<code>null</code>或<code>undefined</code>）的情况下不会引起错误，短路返回值为<code>undefined</code><br>函数调用时，如果给定的函数不存在，也返回<code>undefined</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="">const adventurer = {
  name: 'Alice',
  cat: { name: 'Dinah' }
};
const dogName = adventurer.dog?.name; // undefined
adventurer.someNonExistentMethod?.(); // undefined</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Optional_chaining">可选链操作符 &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">2.6：空值合并操作符（??）</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">80+</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">80+</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">72+</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">13.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">67+</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">57+</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-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">2020-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">2020-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">2020-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">2020-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">2020-03</mark></td></tr></tbody></table></figure>



<p>逻辑操作符，当左侧的操作数为空（<code>null</code>或<code>undefined</code>）时，返回其右侧操作数，否则返回左侧操作数<br>逻辑或（||）的判断条件是“假”（<code>falsy</code>），<code>??</code>的判断条件为“空”（<code>nullish</code>：<code>null</code>或<code>undefined</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="">null ?? 'string';  // "string"
null || 'string';  // "string"
0 ?? 42;  // 0
0 || 42;  // 42</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator">空值合并运算符 &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



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



<h3 class="wp-block-heading">3.1：String.prototype.replaceAll</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">85+</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">85+</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">77+</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">13.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">71+</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">60+</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-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">2020-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">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">2020-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">2020-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">2020-09</mark></td></tr></tbody></table></figure>



<p><code>str.replaceAll(regexp|substr, newSubstr|function)</code><br>第一个参数可以是一个字符串或一个<code>RegExp</code>（需包含标志<code>g</code>，否则<code>TypeError</code>），用来匹配需替换的字符<br>第二个参数可以是一个字符串或一个在每次匹配时被调用的函数<br>效果就是赋予<code>String.prototype.replace</code>全局替换的功能，使用带<code>g</code>的<code>RegExp</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 p = '000222HHHXXX';
p.replaceAll('0', '5');    // '555222HHHXXX'
p.replace('0', '5');       // '500222HHHXXX'
const regex = /h/ig;
p.replaceAll(regex, 'O');  // '000222OOOXXX'
p.replace(regex, 'O');     // '000222OOOXXX'</pre>



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



<h3 class="wp-block-heading">3.2：Promise.any</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">85+</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">85+</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">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">71+</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">60+</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-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">2020-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">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">2020-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">2020-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">2020-09</mark></td></tr></tbody></table></figure>



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



<h3 class="wp-block-heading">3.3：WeakRef</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">84+</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">85+</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">14.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">❌</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></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-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-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">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-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">➖</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></tr></tbody></table></figure>



<p>允许保留对另一个对象的弱引用，且不会阻止被弱引用对象被垃圾回收机制回收<br>因为各版本的垃圾回收机制可能存在差异，难以保证实现效果能保证一样，所以正确使用<code>WeakRef</code>对象时需要仔细的考虑，最好尽量避免使用<br>没有特殊需求很难用到的一个东西，具体要用还得去看详细的文档说明</p>



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



<h3 class="wp-block-heading">3.4：逻辑赋值（&amp;&amp;=、||=、??=）</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">85+</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">85+</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">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"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">71+</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"><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">60+</mark></mark></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-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">2020-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">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">2020-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">2020-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"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">2020-09</mark></mark></td></tr></tbody></table></figure>



<p><code>&amp;&amp;=</code>左侧变量为<code>truthy</code>时，进行赋值；<code>x &amp;&amp;= y</code>等价于<code>x &amp;&amp; (x = y)</code>，非等价<code>x = x &amp;&amp; y</code><br><code>||=</code>左侧变量为<code>falsy</code>时，进行赋值；<code>x ||= y</code>等价于<code>x || (x = y)</code>，非等价<code>x = x || y</code><br><code>??=</code>左侧变量为<code>nullish</code>时，进行赋值；<code>x ??= y</code>等价于<code>x ?? (x = y)</code>，非等价<code>x = x ?? y</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 a = { duration: 50, title: '', name: '' };

a.duration &amp;&amp;= 10;
console.log(a.duration);  // 10
a.duration ||= 20;
console.log(a.duration);  // 10
a.duration ??= 30;
console.log(a.duration);  // 10

a.title &amp;&amp;= 'S1';
console.log(a.title);     // ''
a.title ||= 'S2';
console.log(a.title);     // 'S2'
a.title ??= 'S3';
console.log(a.title);     // 'S2'

a.null1 &amp;&amp;= 'S1';
console.log(a.null1);     // undefined
a.null2 ??= 'S2';
console.log(a.null2);     // 'S2'
a.null3 ||= 'S3';
console.log(a.null3);     // 'S3'

a.name ??= 'S3';
console.log(a.name);      // ''
a.name ||= 'S2';
console.log(a.name);      // 'S2'</pre>



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



<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_OR_assignment">Logical OR assignment (||=) &#8211; JavaScript | MDN (mozilla.org)</a></li>



<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Logical_nullish_assignment">逻辑空赋值 (??=) &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">3.5：数字分隔符（_）</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">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">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">70+</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">13+</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">62+</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"><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"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">❌</mark></mark></mark></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">2019-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">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">2019-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">2019-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">2019-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"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">➖</mark></mark></mark></td></tr></tbody></table></figure>



<p>使用下划线 (_, U+005F) 作为分隔符，为方便数字文字的可读性，包括整数和浮点数</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="">// 可用于金额，方便阅读
123_00                  // 123元，12300分/$123，123美分

// 通用写法，千分位分割
12_000                  // 12k
1_234_500               // 1,234,500
1_000_000_000           // 10亿
101_475_938.38          // 亿级单位

// 小数
0.000_001               // 百万分之一
1e10_000                // 10^10_000，10^10000</pre>



<ul>
<li><a href="https://github.com/tc39/proposal-numeric-separator">proposal-numeric-separator</a></li>
</ul>



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



<h3 class="wp-block-heading">4.1：Class：公有类字段（Public class fields）</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">72+</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">69+</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.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"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">60+</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"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">51+</mark></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">2019-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">2019-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">2021-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">2019-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">2019-03</mark></td></tr></tbody></table></figure>



<p>公有字段都是可编辑、可枚举和可配置的属性，且参与原型的继承，即派生类可通过原型链访问字段<br>字段是在对应的构造函数运行之前添加的，所以在构造函数中可以直接访问字段<br>字段是通过<code>[[Define]]</code>语义（本质上是<code>Object.defineProperty()</code>）添加，其声明并不会触发<code>setter</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="">class ClassField {
    static baseField = 'base field';
    field = 'base';
    // setter
    set fieldSetted(val) {
        console.log('setter：' + val);
    }
    constructor() {
        this.field += ' plus';           // 构造函数中访问字段
        console.log('Base constructor:', this.field);
    }
}
class SubClass extends ClassField {
    field = 'sub';
    // fieldSetted = 'set_1';            // 字段声明不会触发 setter
    constructor() {
        super();
        this.field = this.baseField;     // 实例对象属性值为 undefined
        this.field = SubClass.baseField; // 静态属性原项链访问
        this.fieldSetted = 'set_2';      // this实例赋值，触发 setter
        console.log('Sub constructor:', this.field);
    }
}
new SubClass();
// Base constructor: base plus       super() 中 ClassField 构造
// setter：set_2                     this.fieldSetted 触发 setter
// Sub constructor: base field       通过原型链查找赋值为 'base field'</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Classes/Public_class_fields">公有类字段 &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">4.2：Class：私有类字段/方法（Private class fields/methods）</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">①②74+</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">90+</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.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">①②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">①②53+</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">2019-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">2019-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">2021-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-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">2019-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">2019-07</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"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">②84+</mark></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: #008000;" class="has-inline-color">②84+</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">90+</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">②70+</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">②60+</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-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-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-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-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">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">2020-09</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"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">91+</mark></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: #008000;" class="has-inline-color">91+</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">90+</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">77+</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">64+</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">2021-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">2021-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">2021-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-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">2021-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">2021-05</mark></td></tr></tbody></table><figcaption class="wp-element-caption">①：不支持私有方法；②：不支持 in 判断</figcaption></figure>



<p>通过增加哈希前缀<code>#</code>来定义私有类字段/方法，<code>#</code>是名称本身的一部分，声明和访问时也需要加上</p>



<ul>
<li>私有字段必须先声明，引用未声明的私有字段会抛出语法错误</li>



<li>私有字段仅限在定义它的类的内部访问，派生类/外部调用都会抛出错误</li>



<li>私有字段不能删除，调用<code>delete</code>会抛出语法错误</li>



<li>可使用<code>in</code>运算符检查私有字段是否存在，存在返回<code>true</code>，不存在返回<code>false</code></li>



<li>私有方法可以是异步、生成器、异步生成器方法，其限制同私有字段一样</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="">class ClassField {
    static #staticField;
    #privateField;

    // 方法中调用私有属性/方法，this只能是当前类，否则报TypeError
    static #baseStaticMethod() {
        this.#staticField = 42;
        return this.#staticField;
    }
    static baseStaticMethod1() {
        return ClassField.#baseStaticMethod.call(ClassField);
    }
    static baseStaticMethod2() {
        return ClassField.#baseStaticMethod.call(this);
    }

    constructor() {
        this.#privateField = 42;     // 直接调用，没问题
        delete this.#privateField;   // delete 操作，语法错误
        this.#undeclaredField = 444; // 未声明字段，语法错误
    }
}
const instance = new ClassField()
instance.#privateField === 42;   // 外部调用，语法错误

class SubClass extends ClassField {};
SubClass.baseStaticMethod1();      // this 指向 ClassField，正常调用
SubClass.baseStaticMethod2();      // this 指向 SubClass，TypeError</pre>



<ul>
<li><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Classes/Private_class_fields">类私有域 &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">4.3：Class：静态初始化块（static initialization blocks）</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">94+</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">94+</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">93+</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"><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">❌</mark></mark></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"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">80+</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"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">66+</mark></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">2021-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">2021-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">2021-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"><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">➖</mark></mark></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-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">2021-12</mark></td></tr></tbody></table></figure>



<p>使用<code>static{...}</code>的方式在类中添加静态初始化块，同一个类中可以存在多个初始化块，执行顺序即为书写顺序</p>



<ul>
<li>块内声明变量为局部变量，不会被提升，<code>var</code>定义变量、<code>function</code>函数也不会提升</li>



<li>块内可访问私有属性/字段，包括公有字段和私有字段</li>



<li>块内的<code>this</code>指的是类的构造函数对象，可用于在块内访问静态属性/字段/方法</li>



<li>块内的<code>super</code>可以访问超类的静态属性，包括其属性、字段、方法</li>



<li>块内代码是立即执行的</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="">var y = 'Outer y';
class ClassA {
    static field = 'Inner y';
    static #field = 'Inner y';
    static {
        var y = this.field;
    }
    static {
        console.log(this.field);   // 访问静态属性
        console.log(this.#field);  // 访问私有静态属性
    }
}
class ClassB extends ClassA {
    static {
        console.log(super.field);  // 访问父类静态属性
    }
}
console.log(y); // 块内 var 变量不提升</pre>



<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/Class_static_initialization_blocks">Class static initialization blocks &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">4.4：取值：.at()（Array、String、TypedArray）</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">92+</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">92+</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">90+</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.4+</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">78+</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"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">①②65+</mark></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">2021-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-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-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">2022-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-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-10</mark></td></tr></tbody></table><figcaption class="wp-element-caption">①：未实现 Array；②：未实现 String</figcaption></figure>



<p><code>Array</code>、<code>String</code>、<code>TypedArray</code>（二进制缓冲区），新增<code>at(index)</code>方法，获取指定索引的项目值<br><code>index</code>索引为负数时，表示从数组末端开始的相对索引，当索引值超出有效范围，返回结果为<code>undefined</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 colors = ['red', 'green', 'blue'];
const sentence = 'The quick brown fox jumps over the lazy dog.';
const int8 = new Int8Array([0, 10, -10, 20, -30, 40, -50]);

colors.at(colors.length - 2);      // 'green'
colors.at(-2);                     // 'green'
sentence.at(sentence.length - 2);  // 'g'
sentence.at(-2);                   // 'g'
int8.at(int8.length - 2);          // 40
int8.at(-2);                       // 40
</pre>



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



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



<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/at">TypedArray.prototype.at() &#8211; JavaScript | MDN (mozilla.org)</a></li>
</ul>



<h3 class="wp-block-heading">4.5：Object.hasOwn()</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">93+</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">93+</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">92+</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.4+</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">66+</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">2021-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-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-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">2022-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-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">2021-12</mark></td></tr></tbody></table></figure>



<p><code>hasOwn(instance, prop)</code>用来判断指定对象是否包含指定属性，仅限该对象声明的属性，继承属性不算<br>正常情况下，使用<code>hasOwnProperty</code>也可以得到效果结果，但<code>hasOwnProperty</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 obj = {};
obj.prop = 'exists';
obj.prop2 = null;
obj.prop3 = undefined;

Object.hasOwn(obj, 'prop');             // true
Object.hasOwn(obj, 'toString');         // false
Object.hasOwn(obj, 'hasOwnProperty');   // false
Object.hasOwn(obj, 'prop2');            // true
Object.hasOwn(obj, 'prop3');            // true
Object.hasOwn(obj, 'prop4');            // false

'prop' in obj;                          // true
'toString' in obj;                      // true
'hasOwnProperty' in obj;                // true
'prop2' in obj;                         // true
'prop3' in obj;                         // true
'prop4' in obj;                         // false

const foo = Object.create(null);
foo.prop = 'exists';
Object.hasOwn(foo, 'prop');             // true
'prop' in foo;                          // true
foo.hasOwnProperty('prop');             // TypeError</pre>



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



<h3 class="wp-block-heading">4.6：Error.prototype.cause</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">93+</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">93+</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">91+</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"><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"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">❌</mark></mark></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"><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"><mark style="background-color: rgba(0, 0, 0, 0); color: #008000;" class="has-inline-color">❌</mark></mark></mark></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">2021-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-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-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-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"><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">➖</mark></mark></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"><mark style="background-color: rgba(0, 0, 0, 0); color: #443d66;" class="has-inline-color">➖</mark></mark></mark></td></tr></tbody></table></figure>



<p>该属性用来描述引起该错误的特定原始原因，其值是在<code>options.cause</code>参数中传递给<code>Error()</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 makeRSA(p, q) {
    if (!Number.isInteger(p) || !Number.isInteger(q)) {
        throw new Error('生成 RSA 密钥需要输入整数.', {
            cause: { code: '非整数', value: [p, q] },
        });
    }
    if (!areCoprime(p, q)) {
        throw new Error('生成 RSA 密钥需要输入两个互质整数.', {
            cause: { code: '非质数', values: [p, q] },
        })
    }
    // …
}</pre>



<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause">Error.prototype.cause &#8211; JavaScript | MDN (mozilla.org)</a></li>



<li><a href="https://github.com/tc39/proposal-error-cause">tc39/proposal-error-cause</a></li>
</ul>



<h3 class="wp-block-heading">4.7：正则修饰符：d</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">90+</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">90+</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">88+</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">76+</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">64+</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">2021-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">2021-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">2021-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">2021-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">2021-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">2021-0</mark>5</td></tr></tbody></table></figure>



<p>使用该修饰符，会在结果中添加一个属性：<code>indices</code><br>该属性的值包含所有匹配项的索引信息，其索引值是相对的原始字符串的索引<br>未匹配数据时，将返回<code>undefined</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 re1 = /a+(?&lt;Z>z)?/d;
const s1 = "xaaaz";
const m1 = re1.exec(s1);
console.log(m1.indices);
/*[
    'aaaz', 
    'z', 
    index: 1, 
    input: 'xaaaz', 
    groups: {
        Z: "z"
    }, 
    indices: [
        [1, 5], 
        [4, 5], 
        groups: {
            Z: [4, 5]
        }
    ]
]*/
// 没有匹配时，返回 `undefined`:
const m2 = re1.exec("xaaay");
m2.indices[1] === undefined;
m2.indices.groups["Z"] === undefined;</pre>



<ul>
<li><a href="https://github.com/tc39/proposal-regexp-match-indices">tc39/proposal-regexp-match-indices</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
