[first, a[2], last] = a;
is like
// first == undefined, last == undefined, a == [1,2,3]
first = a[0];
// first == 1, last == undefined, a == [1,2,3]
a[2] = a[1];
// first == 1, last == undefined, a == [1,2,2]
last = a[2];
// first == 1, last == 2, a == [1,2,2]
[first, ...[a[2], last]] = a;
is like
// first == undefined, last == undefined, a == [1,2,3], tmp == undefined
first = a[0];
// first == 1, last == undefined, a == [1,2,3], tmp == undefined
tmp = [a[1], a[2]];
// first == 1, last == undefined, a == [1,2,3], tmp == [2,3]
a[2] = tmp[0];
// first == 1, last == undefined, a == [1,2,2], tmp == [2,3]
last = tmp[1];
// first == 1, last == 3, a == [1,2,2], tmp == [2,3]
[...[a[2], last]] = a;
is like
// last == undefined, a == [1,2,3], tmp == undefined
tmp = [a[0], a[1]];
// last == undefined, a == [1,2,3], tmp == [1,2]
a[2] = tmp[0];
// last == undefined, a == [1,2,1], tmp == [1,2]
last = tmp[1];
// last == 2, a == [1,2,1], tmp == [1,2]