初學者常直覺將 Array 如 String 以 + 合併,但 Array 需以特殊方式才能合併。
Version
macOS Mojave 10.14.5
VS Code 1.35.1
Quokka 1.0.232
ECMAScript 2015
Ramda 0.26.1
Plus Operator
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let arr3 = arr1 + arr2; // ?
直覺會使用 + plus operator 合併 array。

回傳為不預期的 string,並非 array。
Array.prototype.concat()
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let arr3 = arr1.concat(arr2); // ?
ES5 要使用 Array.prototype.concat() 才能合併 array。

Spread Operator
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let arr3 = [...arr1, ...arr2]; // ?
ES6 可在 [] 內使用 ... 將 element 展開,中間加上 , 即可合併 array。

Ramda
import { concat } from 'ramda';
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let arr3 = concat(arr1, arr2); // ?
Ramda 也提供了 concat() 合併兩 array,與 Array.prototype.concat() 不同點在於:
Array.prototype.concat()以 OOP 設計,data 為 object,concat()為 method- Ramda 的
concat()以 FP 設計,data 為 argument,concat()為
curried function
concat()
[a] → [a] → [a]
將兩個相同結構的 array 合併成單一 array
[a]:第一個 array
[a]:第二個 array
[a]:回傳合併後的 array

Conclusion
- 若以原生寫法,
...spread operator 最精簡,且可讀性最高 - Ramda 的
concat()由於是 curried function,適合 function composition 與 point-free - Ramda 的
concat()除了用於 array,也能用在 string
Reference
MDN, Array.prototype.concat()
MDN, Spread syntax
Ramda, concat()