2026-04-09 19:04:57
JavaScript的concat方法通过调用数组的concat实例方法合并数组,返回新数组且不修改原数组;扩展运算符(...)通过解构数组元素到新数组字面量中实现合并,语法更简洁灵活。两者均为浅拷贝,但扩展运算符在混合元素和复杂构建场景中更具优势。
concat方法合并数组的机制与特点不可变数据构建:如数据流处理中逐步生成新数组,确保原始数据不被修改。const initialUsers = [{ id: 1 }];const newUsers = [{ id: 2 }];const allUsers = initialUsers.concat(newUsers); // 新数组
兼容性需求:在老旧项目或需支持ES5的环境中更稳妥。
混合元素插入:可在合并时插入其他元素或结合其他操作符。const base = ['a', 'b'];const mergedWithExtra = [...base, 'c', ...['d']]; // ['a', 'b', 'c', 'd']
浅拷贝:快速创建数组副本,语法简洁。const copy = [...base]; // 新数组,与原数组无关
复杂数组构建:需混合元素、解构赋值或函数参数传递时更直观。
现代开发环境:ES6+环境中首选,代码可读性更高。
concat需显式调用方法,参数列表较长时可能冗余。
扩展运算符直接嵌入数组字面量,更符合现代代码风格。
concat仅支持顺序拼接,无法插入中间元素。
扩展运算符可自由组合元素、解构赋值或与其他操作符(如map、filter)结合。
日常场景中性能差异可忽略,但极端情况下(如超大数组或高频调用),扩展运算符可能更高效(避免中间数组创建)。
两者均为浅拷贝,处理引用类型(如对象、数组)时需额外深拷贝。const original = [{ id: 1 }];const copiedConcat = original.concat();const copiedSpread = [...original];copiedSpread[0].id = 2;console.log(original[0].id); // 2(原数组被修改)