JavaScript/--@
-- (前置)
は、ECMAScript における前置デクリメント演算子です。この演算子は、オペランド(変数
やプロパティ
)の値を 1 減少 させ、減少後の値を返します。この演算子は、主にループやカウンタの更新に使用されます[1]。
構文
-- LeftHandSideExpression[?Yield, ?Await]
LeftHandSideExpression[?Yield, ?Await]
: デクリメントする対象の変数やプロパティ。Yield
とAwait
は、ジェネレーター関数や非同期関数内での使用を制御するためのオプションのパラメータです。
この演算子は、以下のように使用されます:
let x = 5; let y = --x; // y は 4、x は 4
動作
前置デクリメント演算子 (--
) は、以下の順序で動作します:
- 値を減少させる: オペランドの値を 1 減少させます。
- 減少後の値を返す: オペランドの減少後の値を返します。
例
基本的な使用法
以下のプログラムは、前置デクリメント演算子の基本的な使用法を示しています。
// 基本的な使用法 let x = 5; let y = --x; // y は 4、x は 4 console.log(x); // 4 console.log(y); // 4
このプログラムでは、x
の値が 1 減少し、y
には減少後の値が代入されます。
ループでの使用
以下のプログラムは、ループ内で前置デクリメント演算子を使用する例を示しています。
// ループでの使用 for (let i = 5; i > 0; --i) { console.log(i); // 5, 4, 3, 2, 1 }
このプログラムでは、ループの各反復で i
の値が 1 減少します。--i
は、ループの反復ごとに i
を更新するために使用されます。
オブジェクトのプロパティでの使用
以下のプログラムは、オブジェクトのプロパティに対して前置デクリメント演算子を使用する例を示しています。
// オブジェクトのプロパティでの使用 const obj = { count: 5 }; --obj.count; // obj.count は 4 になる console.log(obj.count); // 4
このプログラムでは、obj.count
の値が 1 減少します。
配列の要素での使用
以下のプログラムは、配列の要素に対して前置デクリメント演算子を使用する例を示しています。
// 配列の要素での使用 const arr = [10, 20, 30]; let index = 0; --arr[index]; // arr[0] は 9 になる console.log(arr); // [9, 20, 30]
このプログラムでは、arr[index]
の値が 1 減少します。
式内での使用
以下のプログラムは、式内で前置デクリメント演算子を使用する例を示しています。
// 式内での使用 let x = 5; let y = 10; let z = --x + y; // z は 14、x は 4 console.log(x); // 4 console.log(z); // 14
このプログラムでは、--x
が評価されて 4
となり、それに y
の値 10
が加算されて z
に 14
が代入されます。
注意点
- 副作用: 前置デクリメント演算子は、オペランドの値を変更するため、副作用があります。式の中で使用する場合、その副作用に注意が必要です。
- 数値以外のオペランド: オペランドが数値でない場合、JavaScript は自動的に数値に変換しようとします。例えば、文字列
"5"
は数値5
に変換されます。 - 定数への使用:
const
で宣言された変数に対しては、前置デクリメント演算子を使用できません(再代入できないため)。
後置デクリメント演算子との違い
前置デクリメント演算子 (--@
) と後置デクリメント演算子 (@--
) の主な違いは、以下の通りです:
- 前置デクリメント: 値を減少させた後に返す。
- 後置デクリメント: 値を返した後に減少させる。
例:
let x = 5; let y = --x; // y は 4、x は 4 let a = 5; let b = a--; // b は 5、a は 4
脚註
- ↑ 前置デクリメント演算子は、式の評価前に値を減少させるため、式の結果に影響を与えます。