JavaScript中返回省略指定属性对象的最佳实现方式
在JavaScript中移除对象属性并返回新对象的最佳方式
首先得澄清一点:你用{ ...obj, c: undefined }这种方式,并没有真正移除c这个键——它依然存在于返回的对象中,只是值被设为undefined。如果要彻底移除属性,得用其他方法。
接下来针对你不想用扩展运算符创建中间对象的需求,我给你几个实用的方案:
1. 直接删除属性(注意原对象是否可修改)
如果允许修改原始对象,那最简单的方式就是直接用delete操作符:
function removeCKey() { const obj = {a: 'a', b: 'b', c: 'c'}; delete obj.c; return obj; } const myObj = removeCKey(); // myObj 现在是 {a: 'a', b: 'b'},没有c键
但要注意:这种方式会修改原始对象,如果这个对象在其他地方还会被用到,可能会引发意外问题。
2. 复制后删除(不修改原对象)
如果不想改动原对象,可以先浅复制一份,再删除目标属性:
function removeCKey() { const obj = {a: 'a', b: 'b', c: 'c'}; const newObj = Object.assign({}, obj); // 浅复制原对象 delete newObj.c; return newObj; } const myObj = removeCKey();
这里Object.assign会创建一个全新的对象,复制原对象的所有可枚举属性,然后删除新对象上的c,原对象完全不受影响,也没有用到扩展运算符。
3. 支持多属性移除的通用函数
如果需要一次性移除多个属性,可以写一个更灵活的通用函数:
function removeProperties(obj, ...keysToRemove) { const newObj = Object.assign({}, obj); keysToRemove.forEach(key => delete newObj[key]); return newObj; } // 使用示例 const originalObj = {a: 'a', b: 'b', c: 'c', d: 'd'}; const myObj = removeProperties(originalObj, 'c', 'd'); // myObj 是 {a: 'a', b: 'b'}
这个函数可以处理任意数量的属性移除需求,同样不会修改原对象,也符合你避免扩展运算符的要求。
关于你提到的解构扩展方式
顺便说一句,你之前写的解构扩展代码(const {c, ...rest} = obj; return rest;)其实是现在社区比较推荐的简洁写法。虽然确实会创建中间对象,但在大多数业务场景下,这种性能影响可以忽略不计——现代JS引擎对这种语法的优化已经做得很好了。如果不是在性能极其敏感的场景(比如高频循环),其实完全可以放心使用。
总结一下:
- 如果允许修改原对象:直接用
delete是最快的选择 - 不允许修改原对象:用
Object.assign复制后删除,或者通用的移除函数 - 追求代码简洁且不在意中间对象:解构扩展是最优方案
内容的提问来源于stack exchange,提问作者Andrea Zornada
相关产品推荐
相关产品推荐

