この記事では、GASのWhile文の条件式に使われている=(代入演算子)について紹介します。
While文の条件式に比較演算子(==, != <, <=, >, >=, など) が使われているのはよく見るけど、代入演算子(=)はどういう意味なの?という疑問を解消します。
以下が、While文の条件式に=(代入演算子)を使ったサンプルスクリプトです。
1 2 3 4 5 6 7 8 |
function sample1() { let x = 5; while (x = x - 1) { console.log(x); } } |
実行結果は以下のとおりです。
1 2 3 4 |
4 3 2 1 |
このスクリプトではTrue/Falseの判定が「暗黙の型」でなされています。GASの特徴として、数値の0はfalse、1以上の整数はtrueと判定されます。
1 2 3 |
console.log(Boolean(0)); //false console.log(Boolean(1)); //true console.log(Boolean(5)); //true |
それでは、While文の条件式の=(代入演算子)の意味を見ていきましょう。
While文の条件式に代入式を使うと「変数の代入」と「変数の評価」が同時に行われます。sample1では、条件式の中で「変数xの減算」と「変数xの評価」が同時に行われています。変数xが1ずつ減算されていき、0(false)になったときにループを抜ける仕組みです。
とはいえ「同時に」といっても、プログラムには実行の順番があるので、厳密には「変数の代入」と「変数の評価」には順番があると考えられます。sample1の実行ログでは最後の0が出力されていないので、条件式の中では「変数の代入」→「変数の評価」の順番で処理されていることがわかります。
条件式の中で関数を呼び出し、戻り値を変数に代入する方法でも結果は同じになります。
1 2 3 4 5 6 7 8 9 10 11 12 |
function sample2() { let x = 5; while (x = minus(x)) { console.log(x); } } function minus(x) { return x -= 1; } |
1 2 3 4 |
4 3 2 1 |
sample2でも最後の0が出力されていないので、条件式では「変数の代入」→「変数の評価」の順番で処理が行われていることがわかります。
例外として、条件式の中でデクリメント(後置デクリメント)演算子を使うと挙動が変わります。
1 2 3 4 5 6 7 8 |
function sample3() { let x = 5; while (x--) { console.log(x); } } |
1 2 3 4 5 |
4 3 2 1 0 |
sample1,2と実行結果が異なります。最後の0がログ出力されているので、条件式の中では「変数の評価」→「変数の代入」の順番で処理されていると推測できます。
以上、While文の条件式に=(代入演算子)を使ったときの挙動について紹介しました。