例えば、下記のlistB
は展開されるけど、listA
は展開されない。
[ ...listA ] = [ ...listB ]
結果的に以下の書き方と一緒になる。
listA = [ ...listB ]
じゃあ最初の書き方は何をしてるの?と言うと残余を取っている。
const listB = [ 1, 2, 3, 4 ]
const [ a, b, ...listA ] = [ 0, ...listB ]
//a = 0, b = 1, listA = [ 2, 3, 4 ]
ここで左辺値は残余を取ると右辺値が何であれ普通の配列として代入されるようだ。
普通は気にしなくて良いが、TypedArray
などを使用する場合は気をつけたい。
仮にTypedArray
に対して分割代入したい場合は以下のようにすると良い。
Object.assign(
typedArray.subarray( destStart, destEnd ),
[ ...iterable ].slice( srcStart, srcEnd )
)
Object.assign() - JavaScript | MDN
TypedArray.prototype.subarray() - JavaScript | MDN
というわけで
「...」はiterableの展開と残余の代入の両方あるから気をつけようね。