式の評価順(演算子の優先順位).js
解釈した結果なんらかの値になる部分は全部「式」ですが、この優先順位は決まっています。
演算子の種類に応じて19〜1の数字が割り当てられていて、数字が大きいものから順番に処理される、と考えるのが良さそう。
各演算子の解説
※1 : x, y, zはオペランド(被演算子)です
※2 : 結合性は「同じ優先度の演算子同士での評価順の方向」です。(→)なら左側、(←)なら右側が先に評価されます。
優先度19(結合性×)
グループ化演算子 ((x) / 式での評価の優先順位を制御する。これが一番上にいないと困るだろ。) 優先度18(結合性→)
オプショナルチェーン (x?.yなど / メンバーアクセスに近いが存在しなかったときに短絡評価でundefinedになる) 引数付きnew演算子 (new x(...y) / ユーザー定義のオブジェクト型やコンストラクター関数を持つインスタンスを作成する) 関数呼び出し (x(...y) / その名の通り関数を呼び出す) ダイナミックインポート (import(moduleName) / モジュールをインポートしてPromiseで返す? (※英語版のリストにのみ掲載)) 優先度17(結合性←)
優先度16(結合性×)
後置デクリメント (x-- / 評価値はxで、副作用としてxを今より1小さい値にする) 優先度15(結合性←)
前置インクリメント (++x / 評価値はx + 1、副作用としてxを今より1大きい値にする) 前置デクリメント (--x / 評価値はx - 1、副作用としてxを今より1小さい値にする) 単項プラス (+x / xをNumber型に変換した値を返す。) 単項マイナス (-x / xをNumber型に変換した上で符号を反転した値を返す。) ビット否定 (~x / xを32bit符号付き整数に変換し各ビットを反転させた値を返す。小数点以下破棄。-(Math.trunc(x) + 1) || 0と等価?) 優先度14(結合性←)
べき乗 (x ** y / xとyをNumber型に暗黙の型変換をし、$ x^yを返す。) 優先度13(結合性→)
乗算 (x * y / xとyをNumber型に暗黙の型変換をし、$ xyを返す。) 除算 (x / y / xとyをNumber型に暗黙の型変換をし、$ x ÷ yを返す。) 剰余 (x % y / xとyをNumber型に暗黙の型変換をし、xをyで割ったあまり($ x\bmod y)を返す。) 優先度12(結合性→)
減算 (x - y / xとyをNumber型に暗黙の型変換をし、$ x - yを返す。) 優先度11(結合性→)
左ビットシフト (x << y / xを2進数に変換して左にybitずらした値を返す。溢れた分は破棄、空いた分は0を挿入。x * 2 ** y % 2 ** 32 || 0と等価?) 右ビットシフト (x >> y / xを2進数に変換して左にybitずらした値を返す。溢れた分は破棄、空いた分は最上位ビットをコピー。) 符号なし右ビットシフト (x >>> y / xを2進数に変換して左にybitずらした値を返す。溢れた分は破棄、空いた分は0を挿入する。) 優先度10(結合性→)
クラス継承確認演算子「instanceof」 (x instanceof y / xがyクラス(またはそれを継承したクラス)のオブジェクトならtrue、そうでないならfalseを返す。正確にはプロトタイプチェーンを確認している) 優先度9(結合性→)
優先度8(結合性→)
優先度7(結合性→)
優先度6(結合性→)
優先度5(結合性→)
優先度4(結合性→)
優先度3(結合性←)
#スタブ これ、MDN Web Docs(en-US)では優先度2にまとまってる。jaとen-US、どっちが正しいか要検証 優先度2(結合性←)
代入演算子 (x = y / xにyを代入し、評価値はyになる) 複合代入演算子 (+=, -=, *=, /=, **=, %=, <<=, >>=, >>>=, &=, ^=, |=, &&=, ||=, ??= / x = x … yのショートハンド。詳細は後述→式の評価順(演算子の優先順位).js#6489509273e5220000e2c2b0) アロー関数式 (p => c / 関数オブジェクトを作成、詳細は当該MDN Web Docsを参照 (※厳密には演算子ではないけど参考までに)) スプレッド構文 (...iterable / 反復可能オブジェクトの各要素を引数や要素が期待される場所で展開できる。(※厳密には演算子ではないけど参考までに)) 優先度1(結合性→)
カンマ演算子 (x, y / 複数の式を評価した上で、後ろの(複数繋いだ場合は"一番最後の")値を返す。(※配列、オブジェクト、関数の引数などで使うカンマとは別物) /icons/hr.icon
※1 : 加算・連結演算子の挙動解説
1. xとyがともにNumber, Boolean, Null, Undefined型のいずれかならxとyをNumber型に暗黙の型変換し、2数の和をNumber型で返す。 2. xとyがともにBigInt型なら、2数の和をBigInt型で返す。
3. 被演算子の組み合わせが「BigIntとNumber, Boolean, Null, Undefined型のいずれか」の場合はエラーが発行される。
4. 上3つの条件に当てはまらなければ、xとyをString型に暗黙の型変換し、2つの文字列を連結した1つの文字列をString型で返す。 ※2 : 複合代入演算子
x += yはx = x + yと全く同じ効果を持つ。他も同様。
複合代入演算子の評価値は代入したあとの左側の値になる。
追記
何事???