
使用扩展运算符 {...obj, newProp: value} 可在不修改原对象的前提下,创建并推送一个带新增属性的新对象;若需复用原对象引用,则可用 Object.assign(obj, {newProp: value}) 实现就地更新后推送。
使用扩展运算符 `{...obj, newprop: value}` 可在不修改原对象的前提下,创建并推送一个带新增属性的新对象;若需复用原对象引用,则可用 `object.assign(obj, {newprop: value})` 实现就地更新后推送。
在 JavaScript 中,向数组中“推送一个已增强属性的对象”是一个常见需求,但关键在于:你是否需要保留原始对象不变(推荐的函数式风格),还是允许直接修改它(命令式风格)。两种方式均可实现“一操作完成添加 + 推送”,但语义与副作用不同。
✅ 推荐方式:不可变更新(创建新对象)
利用对象展开语法(spread syntax),一行内构造新对象并推送:
const obj = { name: "Alice", age: 30 };
const col = [];
col.push({ ...obj, extraInfo: "shazoo", timestamp: Date.now() });
console.log(col);
// [{ name: "Alice", age: 30, extraInfo: "shazoo", timestamp: 1717023456789 }]该方式安全、可预测,不会影响 obj 的原始状态,适合 React 状态更新、Redux、或任何强调不可变性的场景。
⚠️ 替代方式:可变更新(修改原对象)
若明确希望复用 obj 引用(例如后续还需使用该对象),可结合 Object.assign() 实现就地增强并推送:
const obj = { name: "Alice", age: 30 };
const col = [];
col.push(Object.assign(obj, { extraInfo: "shazoo", updated: true }));
console.log(col);
// [{ name: "Alice", age: 30, extraInfo: "shazoo", updated: true }]
console.log(obj === col[0]); // true —— 同一引用注意:Object.assign() 返回目标对象(即 obj),因此可直接用于 push()。但需警惕——这会污染原始对象,可能引发意外的副作用(如其他代码依赖 obj 的纯净状态)。
? 总结建议:
- 优先使用
{...obj, key: value}—— 简洁、安全、符合现代 JS 最佳实践; - 仅当性能敏感(如超大对象且确定无副作用)或框架约束要求复用引用时,才考虑
Object.assign(); - 避免
obj.extraInfo = "shazoo"; col.push(obj)这类两步写法——它虽直观,但不符合“单操作”诉求,且破坏了原子性。

















