es6 の新しい演算子には次のものが含まれます: 1. オプションのチェーン演算子「?.」。演算子の前のプロパティが有効かどうかを判断し、それによってチェーン内のオブジェクトのプロパティを読み取るか、未定義を返します。2. 指数関数演算子「**」、指数演算に使用される中置演算子、構文「x ** y」; 3. Null 値結合演算子「??」; 4. 論理代入演算子「&&=、「|| ="、"」 ??=、主にそれ自体に対して論理演算を実行し、その後の値をそれに代入します; 5. 拡張演算子「...」。
このチュートリアルの動作環境: Windows 7 システム、ECMAScript バージョン 6、Dell G3 コンピューター。
インタビュアー: es6 の新しいオペレーターについて教えていただけますか?
インタビュアー: うーん。 。 。
インタビュアー: たとえば、オプションの連鎖演算子ですか?
インタビュアー: うーん。 。 。
インタビュアー: はい、今日のインタビューはここまでです。
インタビュアー: うーん。 。 。
上記のシーンはまったくの架空のもので、似ているかもしれません、ははは。
今日は、es6 のいくつかの新しい演算子を学び、統合しましょう。
オブジェクトのプロパティ。このプロパティがオブジェクトの場合、それも存在します。
var obj = {a: {key: 'val'}} console.log(obj.a.key) // val
などのこのサブプロパティにアクセスするときに、プロパティが存在しない場合、エラーが報告されることがあります。
var obj = {key: 'val'} console.log(obj.a.key) // error: Cannot read properties of undefined (reading 'key')
この状況に対応したい場合は、互換性を持たせるためのデフォルト値を追加する必要があります。
var obj = {key: 'val'} console.log((obj.a || {}).key) // undefined
レベルが深すぎると、読みにくくなります。
(((obj.a || {}).b || {}).c || {}).d // 或者 obj.a && obj.a.b && obj.a.b.c && obj.a.b.c.d
オプションのチェーン演算子は、この記述方法を改善するために使用されます。 ?.
で表されます。
上記の例は、オプションのチェーン演算子を使用して書き直すことができます
obj.a?.key obj.a?.b?.c?.d
効果は同じですが、可読性が向上し、コードが節約されますか?
そのような属性が存在しないことが判明した場合、以降のポイント操作は実行されません。
関数実行時に書き込むこともできます。関数が関数ではない可能性がある場合にも対応します。 この場合、関数名を最初に定義するか、値を指定する必要があります。そうでない場合でも、エラーが報告されます。
var fn fn?.() // 不会报错 fn1?.() // 报错
オプションの連鎖は、スーパー キーワード、テンプレート文字列、インスタンス化コンストラクター、代入演算子の左側などでは使用できません。
super?.fn() // error new Fn?.a() // error obj.a?.`${b}` // error obj?.a = obj
以前は次のように累乗を計算していました
Math.pow(2,3) // 8
今では指数演算子を使用して計算できるようになりました。* *
は
2 ** 3 // 8
を連続して書くこともできることを意味します
2** 3 ** 3 // 134217728
右から計算しているのに、なぜこんなに大きくなるのか疑問に思われるかもしれません。 2**(3 ** 3)
と同等。
この演算子は、??
で表されます。デフォルト値は、左側の値が unknown
または null
の場合にのみ実行されます。
例を見てみましょう:
var a = '' ?? 'default' console.log(a) // '' var a = 0 ?? 'default' console.log(a) // 0 var a = 123 ?? 'default' console.log(a) // 123 var a = undefined ?? 'default' console.log(a) // default var a = undefined ?? 'default' console.log(a) // default
&&
または ||
と混合する場合は、() を追加する必要があります。
優先度を表示します。そうでない場合はエラーが報告されます。
var a = undefined ?? 'default' && 'a' // error
論理代入演算子は 3 つあります:
主に自身に対して論理演算を実行し、次の値を代入します。それ。
例を通して見てみましょう:
var a,b,c a &&= 1 // undefined //等同于 a && (a = 1) b ||= 1 // 1 //等同于 b || (b = 1) c ??= 1 // 1 //等同于 c ?? (c = 1)
Expand 演算子 … は、反復可能なオブジェクトを個別の要素に展開するために ES6 で導入されました。いわゆる反復可能オブジェクトとは、for of ループを使用して走査できるオブジェクト (配列、文字列、Map、Set、DOM ノードなど) です。
1. 配列オブジェクトのコピー
展開演算子を使用して配列をコピーすることは、ES6 では一般的な操作です:
const years = [2018, 2019, 2020, 2021]; const copyYears = [...years]; console.log(copyYears); // [ 2018, 2019, 2020, 2021 ]
展開演算子は、配列のみ最初の層はディープ コピーです、つまり、スプレッド演算子を使用して 1 次元配列をコピーすることはディープ コピーです。次のコードを参照してください:
const miniCalendar = [2021, [1, 2, 3, 4, 5, 6, 7], 1]; const copyArray = [...miniCalendar]; console.log(copyArray); // [ 2021, [ 1, 2, 3, 4, 5, 6, 7 ], 1 ] copyArray[1][0] = 0; copyArray[1].push(8); copyArray[2] = 2; console.log(copyArray); // [ 2021, [ 0, 2, 3, 4, 5, 6, 7, 8 ], 2 ] console.log(miniCalendar); // [ 2021, [ 0, 2, 3, 4, 5, 6, 7, 8 ], 1 ]
出力されたものを配置します比較は次のとおりです:
変数の説明 | 結果 | 操作 |
---|---|---|
copyArray | [ 2021, [ 1, 2, 3, 4, 5, 6, 7 ], 1 ] | Copy ArrayminiCalendar |
##copyArray
| [ 2021, [ 0, 2, 3, 4, 5, 6, 7, 8 ], 2 ]
| 1. 配列の 2 番目の要素の最初の要素を 0 に再割り当てします。2. 要素 8 を配列に追加します。配列の 2 番目の要素; 3. 配列の 3 番目の要素を 2|
miniCalendar
| [ 2021, [ 0] に再割り当てします。 , 2, 3, 4, 5, 6, 7, 8 ], 1 ]
| 結果から、配列の 2 番目の要素は 1 次元より大きい配列です。内部の要素により、元の変数が変化します。値はそれに応じて変化します。