分割代入することで、「配列」や「オブジェクト」を分解し、
その配列の要素やオブジェクトのプロパティを一気に、個々の変数へと代入できます。
この機能により、他のスクリプト言語の「多重代入」に似たことを実現出来ます。
let [var1, var2] = [10, 20]; hm.debuginfo(var1); // 10 hm.debuginfo(var2); // 20
「...」演算子を利用することで、「残りの要素を配列にして」、
1つの変数に代入します。
let [var1, var2, ...other] = [10, 20, 30, 40, 50] hm.debuginfo(var1); // 10 hm.debuginfo(var2); // 20 hm.debuginfo(other); // 30,40,50。others は [30,40,50] という配列
let {foo, bar} = {foo:"こちら", bar:"あちら"}; hm.debuginfo(foo); // こちら hm.debuginfo(bar); // あちら
受け取る変数名を変更する場合には、以下のようにします
let {foo:x, bar:y} = {foo:"こちら", bar:"あちら"} hm.debuginfo(x); // こちら hm.debuginfo(y); // あちら
オブジェクトのプロパティに対応するものが無かった場合に備え、デフォルト値を設定しておくことが出来ます。
let {foo="どちら", bar} = {bar:"あちら"} hm.debuginfo(foo); // どちら hm.debuginfo(bar); // あちら
配列については宣言時と同様に代入できます。
let var1, var2; [var1, var2, ...other] = [10, 20, 30, 40, 50] hm.debuginfo(var1); // 10 hm.debuginfo(var2); // 20 hm.debuginfo(other); // 30,40,50。others は [30,40,50] という配列
しかし、オブジェクトのプロパティは要注意です。
以下は間違いです。
let foo, bar; {foo, bar} = {foo:"こちら", bar:"あちら"} // エラーとなってしまう。
これは、初期化時以外は{...}が複数ステートメントを囲い込むブロックとみなされてしまうためです。
このため、全体を(...)で囲む必要があります。
以下のようにするのが正しくなります。
ここは気づきにくいポイントですので注意してください。
let foo, bar; ({foo, bar} = {foo:"こちら", bar:"あちら"}) // このように( )で全体を囲い込む必要がある。 hm.debuginfo(foo); // こちら hm.debuginfo(bar); // あちら
let [var1, var2] = [10, 20]; [var1, var2] = [var2, var1]; hm.debuginfo(var1); // 20 hm.debuginfo(var2); // 10
function multi_return_func() { return [10, 20]; } let [var1, var2] = multi_return_func(); hm.debuginfo(var1); // 10 hm.debuginfo(var2); // 20