Т.е. операции по типу [[...arr], value] так же сработают по скорости и логике, как arr.push(value)?
Нет. push быстрее.
А если чуть более детально, то под капотом это выглядит примерно так:
- Вы объявили пустой массив. Движок зарезервировал память на массив из 10ти(разные движки могут под разную длину массива резервировать место) элементов.
- Делаете пуш. Пока элементов меньше чем зарезервировано - всё очень быстро, так как движок просто кладёт элемент в зарезервированную ячейку памяти, адрес которой известен.
- Как только элементов стало больше, под капотом ищется новая доступная область памяти на ещё 10 элементов и далее эти области памяти линкуются между собой (первая + вторая).
В случае же со spread [...array] каждый раз создаётся новый массив, то есть каждый раз происходит поиск доступной памяти на массив + перебор массива для того чтобы заспредить его.
Примерно так.