ECMAScript は 2015 年に ES6 を正式リリースしてから 8 年が経過しました。2015 年以降、毎年 6 月にその時点の年をバージョン番号として新しいバージョンがリリースされます。
これらの多くのバージョンには多くの新機能が登場しており、記憶しやすいように、この記事ではすべての新機能を整理しました。
ps: ES2015以降のバージョンをまとめてES6と呼んでいるという情報もあれば、ES6はES2015、ES7はES2016といったように言われている情報もありますが、ここでは触れません。
ES2015 は、次の図に示すように、基本的に ES2015 より前のすべての内容が拡張されたバージョンです。
より
前では、変数を宣言する方法はvar
キーワードを使用する 1 つだけでした。ES2015 では、変数と定数を宣言するためにlet
キーワードとconst
キーワードが追加されました。
宣言
変数 let v = 100 v = 200 // 定数を宣言 const V = 200 // 定数を変更します // V = 300 //
let
およびconst
キーワードを使用して宣言された変数または定数は、ブロック レベルのスコープを持ちます。
サンプル コードは次のとおりです
。 var v = 100 } { val = 200 とします } コンソール.ログ(v) console.log(val) // エラー val が定義されていません
let
またはconst
キーワードを使用して宣言された変数には変数昇格の特性がなく、一時的なデッド ゾーンがあることに注意してください。
ES2015 で関数がデフォルト値を使用できるようになります。サンプルコードは次のとおりです。
// es2015 の前の function foo(v) { v = v ? : 100 リターンv } //es2015 関数バー(v = 100) { リターンv
複数のパラメーターがある場合は、デフォルトのパラメーターを後ろから前に使用する必要があることに注意してください
。
ES2015 では、関数の短縮形式であるアロー関数が追加されました。サンプル コードは次のとおりです。
function foo(v) { return v`` } // アロー関数を書く const foo = (v) => { v } //略語1 const foo = v => { // 括弧を省略できるパラメータは 1 つだけです return v } // 略語2 const foo = v => v //声明には、
矢印関数のthis
this
コンテキストに基づいて決定されていることに注意してください
。
矢印関数を
使用する場合、内部引数オブジェクトはありませんが、代わりに残りのパラメーターは
次のとおりです
。// console.log(arguments) // ReferenceError: 引数が定義されていません console.log(args) // args は配列です}
foo
(1、2、3、4)// [1、2、3、4]
ES2015の関数に追加された属性は
、サンプルコードが次のとおりです
。{ リターンv } const bar = v => v console.log(foo.name) // foo console.log(bar.name)// bar
の拡張は、主にMath
とNumber
オブジェクトにいくつかの方法を追加します。
ES2015では、 0b
または0B
がバイナリを表すために使用され、 0o
または0O
OCTALを表すために使用されます。
サンプルコードは次のとおりです。console.log
(0b111111111 === 511)// true console.log(0o777 === 511)//
属性とメソッドは、項目で拡張された属性とメソッドは次のとおりです。
属性 | |
-2^53 | メソッド |
名 | 説明 |
---|---|
番号 | 。 |
max_safe_integer | 最大安全番号( 2^53 ) |
number.parseint()は、 | パラメーターを整数に解析し、 |
number.parsefloat | ( |
) | を返します。 |
Number.isNaN() | で NaN かどうかを判断します。 |
Number.isInteger() で | 整数かどうかを判断します。 |
Number.isSafeInteger() で | 値が安全な範囲内かどうかを判断します。 |
メソッド
名 | 説明 |
---|---|
Math.trunc() | 値の整数部分を返します。sign |
() | 数値タイプ(正数1、负数-1、零0 )を返し |
。テンプレート文字列はフォーマットを保持し、変数を使用できます。
サンプル コードは次のとおりです。
// ` を使用してテンプレート文字列を定義します let str = `a Bowl of months` // テンプレート文字列は形式 let str2 = `週のボウル` を保持できます // テンプレート文字列には変数 const myName = 'A Bowl of months' を使用できます let str3 = `著者:$ {myname}` // $ {}を使用してES2015をラップして
、 | 次 |
の | よう |
---|
に文字列および文字列インスタンスのメソッドも拡張します。
Unicode string.raw | ||
() | すべてのスラッシュが逃げた文字列を返します(つまり、スラッシュの前にスラッシュが追加されます)。これは、テンプレートの文字列処理によく使用されます。 | |
string.prototype.codepointat() | 文字に対応するコードポイントを返します(string.fromCodePoint()の逆 | |
操作 | ) | unicode remulization |
.prototype.Repeat() | String n回を繰り返し、 | |
Prototype.includes( | ) | |
を | 返し |
の | 文字 |
列 |
。カンマで区切ると
サンプルコードは以下のようになります:
const arr = [1, 2, 3, 4, 5, 6] const newarr = [... arr] //配列console.log(math.max.call(null、... arr))//配列の各アイテムを
配列と配列
を使用します一連のメソッドを提供します。これは、 Array.from()
を
1
つずつ導入します
。return array.from(引数)//引数を配列に変換} console.log(foo(1、2、3、4、5、6))// [1、2、3、4、5、6]
Array.of()
:さまざまな数の引数を持つ新しい配列を作成しますたとえば、サンプルコードは次のとおりです。Array.of
(1)// [1] array.of(true、1、 'a bowl of Weeke')// [true、1、 'a bowl of Weeke']
array.prototype.copywithin()は、アレイの一部を同じ配列の別の場所に浅くコピーします、そしてそれを返すことは、元の配列の長さを変えません。
サンプルコードは次のとおりです。const
arr = [1、2、3、4] // インデックス 2 から開始し、最後にコンテンツをインデックス 0 にコピーします arr.copyWithin(0, 2) // [ 3, 4, 3, 4 ]
Array.prototype.find()
、指定されたコールバック関数に従って、最初の一致する要素を見つけ、サンプルコードが次のとおりである場合は未定義です
。 arr.find(item => item === 2) // 2 (要素を示す)、
Array.prototype.findIndex()
、指定されたコールバック関数に従って、最初に一致する要素のインデックスを検索し、見つからない場合は返します - 1 、サンプルコードは次のとおりです。const
arr = [1、2、3、4] arr.findindex(item => item === 2)// 1(indexを示します)
array.prototype.fill
Array.prototype.fill()
、配列を次のように記入します。
、3、4] // インデックス 1 ~ 3 に指定された値を入力します arr.fill( 'A Bowl of Weeks'、1、3)// [1、 'A Bowl of Weeks'、 'A Bowl of Weeke'、4]
Array.prototype.keys()
は、内容のある反復可能なオブジェクトを返します。アレイの鍵です。サンプルコードは次のとおりです。constarr
= [1、true、 'a bowl of Weeke']] const キー = arr.keys() for(キーのconst i){ console.log(i) // トラバーサル結果 0 1 2 }
Array.prototype.values()
、サンプル
コード
が次のとおりです
。const 値 = arr.values() for (値の定数 i) { console.log(i)//トラバーサル結果1 True of Weeke}
Array.prototype.entries()
、コンテンツが元の配列の要素0
あり、 1
が要素である反復性オブジェクトを返します。元の配列の位置の値。
サンプルコードは次のとおりです
。 const iterator = arr.entries() console.log(array.from(iterator))// [[0、1]、[1、true]、[2、 'a bowl of Weeke']]ES2015の
により、オブジェクトの属性名と属性値の一貫性を保つには、属性名を記述するだけです。
サンプルコードは次のとおりです。
const myName = 'A Bowl of months' 定数年齢 = 18 const person = { myName, age } console.log(person) // { myName: 'A Bowl of Zhou', age: 18 }
さらに、オブジェクトを定義するときに、属性名として [] で囲まれた式を使用できます。サンプル コードは次のとおりです。
const myName = 'ボウル週' 定数年齢 = 18 const person = { 私の名前、 ['a' + 'g' + 'e']: 年齢、 } console.log(person)// {myname: 'one bowl zhou'、age:18}
Object.is()
:2つの値が等しいかどうかを比較するために使用され、nan≠= nan、+0を解くために使用されます==== -0問題、
サンプルコードは次のとおりです:
console.log(nan === nan)// false console.log(+0 === -0) // true console.log(Object.is(NaN, NaN)) // true console.log(Object.is(+0, -0)) // false
Object.assign()
: 1 つ以上のソース オブジェクトからターゲット オブジェクトにすべての列挙可能なプロパティの値をコピーし、ターゲット オブジェクトを返します。
例コードは次のとおりです:
const person = object.Assign({}、{name: 'One Bowl Zhou'}、{age:18}) console.log(person) // { name: 'One Bowl Zhou', age: 18 }
Object.getPrototypeOf()
:プロトタイプ オブジェクトを取得します;Object.setPrototypeOf()
:プロトタイプ オブジェクトを設定します。ES2015でクラスの概念を提案し、クラスはサンプルコードの次のとおりです
。 コンストラクター(年齢) { //属性this.myname = '週のボウル' ' this.age = 年齢 } // staticメソッドstatic print(){ console.log() } // アクセサー get myName() { console.log( 'getter') 「数週間のボウル」を返します } myname(v)を設定{ console.log('setter' + v) } setName(v){ this.myname = v } } const person = new Person(18) perse.setname( 'Ywanzhou')//セットアクセサのコンソール(person.myname)//ゲッターアクセサの
ES2015で提案されています
仕様
は、
モジュールをエクスポートしてインポートしてモジュールを導入することができます。
'm' //モジュールMでデフォルトエクスポートをインポートし、メンバーbを個別にインポートするa、{b}をインポートします as as as as as as as as as as as as module in the module inport 'm' // moduleエクスポートconst b = 1 //エクスポートデフォルトb //デフォルトエクスポート{b} //エクスポートオンデマンドオンデマンド{b as bb} //モジュールMでメンバーBをインポートし、
破壊的な割り当てのための新しい構文を追加して、
{m '//エクスポート{b}をエクスポートしますアレイまたはオブジェクトから指定された値を抽出し
ます
。
Zhou '、18] // 2つの変数の値を交換a = 1 b = 2とします ; [a、b] = [b、a] console.log(a、b)// 2 1 //オブジェクト構造の割り当てlet {name:objname/*破壊割り当ての名前変更*/、sex} = {name: 'a bowl of weeks'、sex:1} //関数パラメーターの割り当て機能bar({name、age}){ 返品名 +年齢 } bar({name: 'a bowl of Weeks'、age:18})//週のボウル18
Symbol()
、ES2015で作成され、文字列を渡すことができます。
シンボル()メソッドを介して作成されたシンボル値
を
記述するために使用されます
。*構文 *シンボル([説明]) * *説明 - >はオプションの説明情報です */ //タイプシンボルの値を作成const mysymbol = symbol() console.log(mySymbol) // Symbol() const myName = Symbol('数週間分のボウル') console.log(typeof myname)//シンボルシンボルには、
ここには紹介されない一連のプロパティとメソッドもあります。
Promiseは、ES2015で提供される非同期ソリューションであり、コールバックHellの問題を解決します。
Promise ObjectはPromise()
コンストラクターを介して作成できます
の 2 種類しかありません
。一度状態が変化すると
Promise
then
Promise
で呼び出しを連鎖させることができます。
、下の図に示すように
then
Promise
インスタンスも返されます
サンプルコードは次のとおりです。
新しい約束((Resolve、拒否)=> { console.log(「私は最初の約束のログです」) 解決する() }) .then(() => { console.log( '私は最初のログのログです') }) .then(() => { console.log( '私は2番目のログのログですが、例外があります」) 新しいエラー(「エラー」)を投げる }) .then(() => { console.log( '私は3番目の最初のコールバックのログですが、例外が私の上に発生したために実行しません」) }、()=> { console.log( '私は3番目の2番目のコールバックのログです。それを実行しました」) }) .then(() => { console.log( '私は4番目のログです。そのとき、私は正常に実行できます」) }) /*実行結果は次のとおりです。私は最初の約束のログです 私は最初にログです私は2番目のログ
です
が、3番目のコールバックのログです
Promise のメソッドは次のとおりです。
Promise.prototype.then()
: Promise の成功と失敗のコールバック関数、Promise.all()
Promise.prototype.catch()
then
2 番目のパラメーターと同じです。Promise.all()
:複数のインスタンスを新しいインスタンスにパックし、すべてのインスタンスステータスの変更後に結果配列を返します(すべての変更を変更してから戻ります)Promise.race()
:複数のインスタンスを新しいインスタンスにパックし、すべてのインスタンスステータスを返します。結果(最初に最初に変更して最初に戻る)Promise.resolve()
:オブジェクトを約束のオブジェクトに変換する( new Promise(resolve => resolve())
)Promise.reject()
:オブジェクトをrejected
の状態に変換しますPromise Object new Promise((resolve, reject) => reject())
)Iteratorは、さまざまなデータ構造の統一されたアクセスメカニズムを提供するインターフェースです構造は反復インターフェイスを展開し、統一された方法で通過できます。
繰り返し可能なインターフェイスを実装するデータ構造は、一般にそれ自体を実装するか、 Symbol.iterator
属性を継承します。これは反復可能なオブジェクトです。 Symbol.iterator
プロパティ自体は関数であり、現在のデータ構造のデフォルトのイテレーター生成関数です。
next()
メソッドを含むオブジェクトは、反復可能なオブジェクトと呼ぶことができます。
次のように
next()
つの値を含むオブジェクトを返します
value
:Iteratorによって返されるJavaScript
値。 true
done
たら省略できます。done
:ブール値がfalse
true
いる場合、反復value
停止していないことを意味します。JavaScriptによってネイティブに提供されたイテレーターインターフェイスを以下の図に示します。
次に、OBJのイテレーターを実装します。コードは次のとおりです。const
obj = { [symbol.iterator](){ 戻る { 次 () { console.log( 'iterator exected'); 戻る { 価値: ''、 完了:true //フラグが終わったかどうか、真はそれが終わったことを意味します} } } } }
next()
メソッドを追加して、最終的なランニング結果は、
関数で提供されるジェネレーター
プログラミングソリューションですfunction
キーワードは、関数名と関数名の間に*
アスタリスクを使用し、関数内のyield
キーワードを使用して異なる状態を定義します。
サンプルコードは次のとおりです。
関数* testgenerator(){ //降伏状態を定義します「数週間のボウル」 「ESNEW機能」を獲得する 「ジェネレーター」を返す//ジェネレーターを終了しますが、後で収量キーワードがあっても、無効になります} const g = testgenerator()//ジェネレーターオブジェクトを返し、次の()メソッドg.next()を介して状態を移動します /* { 値: '周の一杯'、完了: false } */ g.next() / * {value: 'es new Feature'、done:false} */ g.next() / * {value: 'generator'、done:true} */
操作 |
---|
があります。
メソッドメソッド | トリガーは | 、
---|---|
特定のプロパティセット(ターゲット、プロップキー、バリュー、レシーバー)を読み取るために | 取得します |
(ターゲット | 、プロップキー、レシーバー)特定の |
プロパティ | を |
書き込むこと | が |
。ターゲット) | object.getPropertypeof() |
setPrototypeof(ターゲット、proto) | object.setPrototypeof() |
isextensible(ターゲット) | object.isextensible() |
objectensions(target) | object.preventextensions() |
getownpropertydescriptor(ターゲット、プロップキー) | object.getownpropertypropertor() |
defineproperty() 、propkey、propdesc) | object.defineproperty() |
offoct.keys | ()、object.getownpropertynames()、object.getownpropertysymbols() |
apply(ターゲット、thisarg、args) | は関数 |
構築物(ターゲット、args | ) |
機能を呼び出すには、 |
プロキシ
Proxy
Proxy
使用を示しています。
<html lang="ja"> <頭> <meta charset="UTF-8" /> <Meta http-equiv = "x-ua-compatible" content = "ie = edge" /> <meta name="viewport" content="width=デバイス幅、初期スケール=1.0" /> <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.0.2/css/bootstrap.min.css" rel="external nofollow" rel="stylesheet" /> <title> set </title>を介してDOMを自動的に更新します </head> <本文> <p class = "card" style = "width:300px; margin:100px auto"> <p class = "card-body"> <h1 id = "name"> </h1> <button id = "btn" class = "btn btn-primary"> modify </button> </p> </p> <スクリプト> // get dom node const name = document.getElementbyid( 'name') const btn = document.getElementById( 'btn') //値const updatedom =(el、value)=> {を変更する関数を定義します el.innerhtml = value } const person = new Proxy({ 名前:「おridgeのボウル」、 }、{ set(Target、Propkey、Value){ //内部の値が変更された場合は、更新に電話してください updatedom(名前、値) ターゲット[PropKey] =値 trueを返す }、 }) name.innerhtml = person.name //ボタンをクリックして、変更操作をトリガーbtn.addeventlistener( 'click'、()=> { person.name === 'Zhouのボウル'? (person.name = 'ポリッジのボウル'): (person.name = 'ワンボウルZhou') }) </script> </body> </html>
上記のコードは、データバインディングに設定された方法を使用します。
Reflectは、ECMAScript2015 handlers
提供されるオブジェクトです。
反射はコンストラクターではありません。つまり、インスタンス化することはできません。
Proxy
オブジェクト(たとえば、 get
、 delete
など)での各インターセプト操作は、それに応じてReflect
法を内部的に呼び出します。
次のように、
それが提供する静的メソッドは、プロキシのhandlers
のメソッド名と一致しています。
デフォルトの呼び出し | 関数 |
---|---|
resprec.get | |
()は | 、オブジェクトのプロパティの値を取得します |
。 | オブジェクト |
オブジェクト | に |
特定 | のプロパティがrefrice.deleteproperty()を持っているかどうかを決定します |
object.getPrototypeof() | 指定された |
オブジェクト | 関数のプロトタイプ | を取得します。
refrect.isextensible() | オブジェクトが拡張可能であるかどうか(つまり、新しいプロパティを追加できるかどうか) |
riff.preventextensions()は、 | 新しいプロパティがオブジェクトに追加されるのを防ぎます |
。getownPropertyDescriptor | () |
refrect.defineProperty | ( |
)は、 | オブジェクトのプロパティを定義または変更し |
ます | 。 |
Set
Map
、 WeakSet
、およびWeakMap
の | |
インスタンス | を実現します。 |
任意
Set
WeakSet
Set
WeakSet
保存できることですを
次のとおりです。
const set = new set(arr) //セットオブジェクトを使用できます...すべてのアイテムconsole.log([... set]))// [1、2、3、4、5]
Map
とWeakMap
オブジェクトに似ており、で保存されますキー価値のペアの形式はい、2つの違いは、 Map
のキー価値のペアが任意である可能性があるのに対し、 WeakMap
のキーはオブジェクトへの参照であり、値は任意のタイプであることです。ES2016 では、次の図に示すように、比較的少数の新機能がリリースされ、主に 2 つの新機能がリリースされます。
には
、
電力演算子とも呼ばれる新しい指数**
があります。
(2、10)// true
eS2016
の配列プロトタイプにincludes()
メソッドを追加します
サンプルコードは次のとおりです:
const arr = [1, 2, 3, 4, 5, NaN] console.log(arr.indexof(nan))// -1 console.log(arr.includes(NaN)) // true
includes()
使用する場合、 NaN
とNaN
、 +0
と-0
が等しいことに注意してください。
Promiseの出現は、コールバックヘルの問題を解決しますが、チェーンコールが多すぎると、読みやすさがさらに悪化します。
Promise は次のように記述します:
;(function () { 関数の約束(v){ return new Promise((解決、拒否) => { 解決(v) }) } const p = promise(1) p.then(res => { Return Promise(res) })。それから(res => { console.log(res) }) })()
次の約束が前のものに依存している場合、この呼び出しチェーンは非常に長くなります
。 関数の約束(v){ return new Promise((解決、拒否) => { 解決(v) }) } const r1 =約束を待つ(1) const r2 =待望の約束(R1) const res =待望の約束(R2) console.log(res) })()
ご覧のとおり、Async/Wait syntactic Sugarを使用して、フラットライティング方法に約束を書き直すことができます。
、この
new
を操作するための一連の静的メソッドを提供し
次のように、ES2017のオブジェクト用に拡張されます
Object.entries()
特定のObject.values()
自体のすべての列挙可能なプロパティ値の配列を返します。Object.getOwnPropertyDescriptors()
、この小さな機能の最後にコンマを追加できます。 2行のコードを変更する必要があります。
例コードは次のとおりです
。 aaaaa、 bbbbb、 CCCCC、 ){}
後続のコンマがある場合、最後にラインを追加する必要があります。これにより、バージョン管理の2行は1つではなく変更されます。
padEnd()
padStart()
2
つ
の新しいインスタンスメソッドを追加します
= '周のボウル' console.log(str.padstart(10)) /* Zhouのボウル* / console.log(str.padend(10)) /* yiwan zhou* /
にはfor await...of
新しい声明があり
ます
。 [Symbol.asyncIterator]() { 戻る { I:0、 次() { if(this.i <3){ Return Promise.Resolve({value:this.i ++、done:false}) } return Promise.resolve({ 完了: true }) }、 } }、 } ;(async function(){ 待っている(非控えめな){ console.log(num) } })() // 0 // 1 //ES2018の
表現の命名
に基づいています。ES2018
の前に、この機能はES2018で紹介できませんでした参照、
サンプルコードは次のとおりです。constRe_date
= /(?<Year> d {4}) - (?<month> d {2}) - (?<day> d {2}) / const matchobj = re_date.exec( '2022-02-22') const year = matchobj.groups.year // 2022 const month = matchobj.groups.month // 02 const day = matchobj.groups.day // 22
sモディファイs
/ドットールモード:新しいSモディファイアは、任意の単一の文字と一致します.
。
逆のアサーション: ES2018より前には前方アサーションのみが存在し、逆アサーションと逆否定的なアサーションがES2018に追加されました。
ES2018では、新しい配列スプレッドオペレーターが追加されました。この機能は次のとおりです
。 const a = {age:18} const person = {... n、... a} // Object console.log(person)// {name: 'A bowl of Zhou'、age:18}
finally()
メソッドはPromise
の状態を返します変更は、 rejected
たりfulfilled
たりするかどうかにかかわらず、 finally()
コールバックが実行されます。
サンプルコードは次のとおりです。Fetch
(url) .then(res => { console.log(res) }) .catch(エラー => { console.log(エラー) }) .finally(()=> { console.log( 'end') })
ES2019で次の2つの内容を最適化しています
Function.prototype.toString()
:returned functionボディにはコメントとスペースが含まtry...catch
catch
います{ console.log( '週のボウル') } キャッチ { console.error( '週のボウル') }
trimStart
String.prototype.trimLeft
String.prototype.trimStart
スペースを削除するために使用されますString.prototype.trimEnd
: 使用される文字列の右側のスペースを削除します。String.prototype.trimRight
: これtrimEnd
配列メソッドです。
Array.prototype.flat()
: これメソッドは、指定されたアレイを深く再帰的に通過し、すべての要素をトラバースアレイの要素と新しい配列に融合し、単にそれを返します。const arr = [0、1、2、[3、4]] console.log(arr.flat())// [0、1、2、3、4]
Array.prototype.flatMap()
:このメソッドは配列をマップしてフラット化し、新しい配列を返します(1つのレベルの配列のみができます。拡張)。()メソッドは
、
Object.fromEntries()
Object.entries()
のペアをオブジェクトに変換します
= { 名前:「Zhouのボウル」、 年齢: '18'、 } const e = object.entries(人) const p = object.fromentries(e) console.log(p)// {name: 'a bowl of weys'、age: '18'}
description
、シンボルオブジェクトを作成するときにオプションの説明文字列を返す読み取り専用プロパティです。
モジュール化は、
ES2020
で動的なインポートを追加します。これは、必要なときにモジュールがロードされることを意味します。
次に(モジュール=> { //モジュールで何かをします。 })
Dynamic Importは、約束を返すimport()
メソッドを使用します。
ES2020では、 meta
オブジェクトもimport
に追加され、コンテキスト固有のメタデータ属性のオブジェクトをJavaScriptモジュールに公開します。
、JavaScriptで許可された最大数がBigInt
2**53-1
であるという問題を解決します。
const thebiggestint = 9007199254740991n; const nogehuge = bigint(9007199254740991); //↪9007199254740991N const ugestring = bigint( "900719254740991"); //↪9007199254740991N const gagehex = bigint( "0x1fffffffffffff"); //↪9007199254740991N const hugeBin = BigInt("0b11111111111111111111111111111111111111111111111111111"); // 9007199254740991N
ノードのGlobal
globalThis
の導入であり、ブラウザ環境がWindow
のGlobalThis
を示しています
。 var getGlobal = function(){ if (typeof self !== '未定義') { return self } if (ウィンドウの種類 !== '未定義') { ウィンドウを返す } if(typeof global!== 'undefined'){return global; 新しいエラーをスローします(「グローバルオブジェクトを見つけることができません」); }; var globals = getGlobal(); if(typeof globals.settimeout!== 'function'){ //この環境には入植がありません! }
// affery(typeof globalthis.settimeout!== 'function'){ //この環境には入植がありません! }
、2つの疑問符で表現されています。計算ルールは、左のオペランドがnull
またはundefined
ある限り、右オペランドが返されることです。そうしないと、左オペランドが返されます。論理または演算子は、左のオペランドがboolean
タイプに変換され、 false
場合にのみ右オペランドを返します。
サンプルコードは次のとおりです:
console.log(null ?? 10)// 10 console.log(未定義?? 10)// 10 console.log(false ?? 10)//この演算子は、値
の
ない変数に値を割り当てるのに役立ちます
コードは次のとおりです:
var値 //値の値がnullまたは未定義でない場合は、10の値を割り当てます 値=値?? console.log(value)// 10itは、
()
値の合体オペレーターと論理的かつ論理的なものであるか、同時に使用できないことに注意してください。
オブジェクトのチェーンを使用する属性の値を読み取るために使用されます属性Aab
、まずA
存在することを確認する必要があります。次に、 Aab
にアクセスする前にAa
確認する必要があります。
オプションのチェーンオペレーターを使用しても、そのような問題が発生しません。1つが存在しない限り、 undefind
返され、エラーは報告されません。
var a = {} // console.log(aab)//エラーConsole.log(aa?.b)//未定義の
オプションチェーン演算子は、サンプルコードの下のメソッドを呼び出すこともできます
。 // obj.fun()メソッドが存在する場合、それが存在しない場合、未定義が返されます。 obj.fun?.a()
Promise.allSettled()
メソッドは、すべてのオブジェクトが対応する約束を表すオブジェクトの配列で、約束が解決または拒否された後、約束を返します。
replaceAll()
のメソッドは、新しい文字列のコンテンツが次のようになります
。 const newtr = str.replaceall( 'porridge'、 'week')) console.log(newtr)//数値セパレーター(_)は
、
_
を読みやすくします
)//シンボル1000000は
WeakRef
読み取り
のためにのみ影響します。
別のオブジェクトへの参照。
eS2021のPromise.any()
メソッドは、 Promise.any()
promise.all()
と同じパラメーターを受け入れます(つまり、すべての約束が失敗/拒否されます)、失敗した約束、および集計エラータイプのインスタンスが返されます。
は、次のように新しい割り当て
||=
&&=
??=
されています
。
] = [true、false] f1 && = '週のボウル' // str = str && 'a bowl of Weeke'に相当 f2 || = '週のボウル' // str = str || f3 ?? = '週のボウル' // str = str ?? '
、SAMPLEコードは次のとおりconstructor
。 myname = 'Zhouのボウル' } /*両方とも一貫性があります*/ クラスC { コンストラクター() { myname = 'Zhouのボウル' } }
ES2022では、メンバーが初期化なしで宣言されている場合、そのデフォルト値は未定義です。
サンプルコード
のプライベートメンバーとして#でwhitedclass c {
#
使用するという名前の変数を使用できます。
#myname = '1つのボウルウィーク' } const c = new C()console.log(#myname)//プライベートフィールドは
await
れたクラスで宣言する必要があります
「モジュール」からのインポート{asyncfun}の
async
コードを使用せずにトップレベル
waitasyncfun() console.log(123)
Object.hasOwn()
メソッドは、サンプルコードが次のとおりであるかどうかを判断するために使用されます
。 名前:「Zhouのボウル」、 年齢:18歳、 } console.log(object.hasown(person、 'name'))// true console.log(object.hasown(person、 'sex'))// false
eS2022の新しいat()
メソッド、その機能は配列のメンバーを取得することであり、そのパラメーターはインデックスですインデックスを直接使用することとは異なります。これは、サンプルコードが次のようになります
。 6] console.log(arr.at(-1))// 6 // arr.length -1]
exec()
表現は、a /d
モディファイアを使用する場合、A /d
モディファイアがある場合、結果はより多くのインデックスを返します。属性は、元の文字列で一致する結果の開始インデックス値を示すために使用されます。
サンプルコードは次のとおりです:
const str = 'javascript' const r = /a /d const m = r.exec(str) console.log(m.indices [0] // [1、2]この記事は、ES2015からES2022までの新しい機能をまとめまし
。
マインドマップは次のとおりです。