String.prototype.concat()

String.prototype.concat() 方法将一个或多个字符串与原字符串连接合并,形成一个新的字符串并返回。

const a = [1, 2, 3]
const b = [4, 5, 6]

const merged = [].concat(a, b) // [1, 2, 3, 4, 5, 6]
// 或
const alsoMerged = a.concat(b) // [1, 2, 3, 4, 5, 6]

这两种方法都会产生新的数组,而不会改变原数组。

扩展运算符

const a = [1, 2, 3]
const b = [4, 5, 6]

const merged = [...a, ...b] // [1, 2, 3, 4, 5, 6]

两者的比较

String.prototype.concat() 可以比展开运算符更好地处理非数组值,这可能是在合并不确定是否为数组的值时需要考虑的问题:

const a = [1, 2, 3]
const b = true
const c = 'Hello'

const mergeAb = [...a, ...b] // Error:b 不可迭代
const mergeAc = [...a, ...c] // [1, 2, 3, 'h', 'i'] 错误的结果
// 你应该改用 [...a, b] 和 [...a, c]

const concatAb = [].concat(a, b) // [1, 2, 3, true]
const concatAb = [].concat(a, c) // [1, 2, 3, 'Hello']

如上面所看到的,当传递不可迭代对象时,展开运算符要么抛出错误,要么不输出正确的结果。而 String.prototype.concat 则不会出现这样的问题。

该如何选择?

只要知道输入是数组,就使用展开运算符(...),因为它的性能更好,而且易于阅读和理解。

当您对一个或多个输入不确定且不想添加额外的检查时,请使用 String.prototype.concat(),因为它可以更优雅地处理这些情况。