解构赋值中用剩余属性语法(如const { password, token, ...safedata } = user)可安全提取对象第一层剩余属性,生成浅拷贝新对象,基本类型独立、引用类型共享;需防null/undefined,支持空对象兜底;相比object.assign更适用于剔除固定字段,但不支持动态key和嵌套处理。

浅拷贝本身不“过滤”属性,但在对象解构赋值中,利用 剩余属性语法(rest syntax) 可以自然实现安全的一层属性提取——它在解构的同时生成一个新对象,该对象是原对象第一层的浅拷贝,且不包含被显式解构出的字段。
用 rest 语法提取剩余属性(最常用)
写法如 const { password, token, ...safeData } = user;。这行代码做了三件事:
- 从
user中读取所有自身可枚举属性(跳过原型链、Symbol、不可枚举属性) - 把
password和token的值单独取出,赋给同名变量 - 把其余所有顶层属性(包括
profile、settings等对象或数组)原样复制到新对象safeData中
safeData 是浅拷贝结果:基本类型值独立,引用类型仍共享内存地址。适合剔除 1–3 个已知敏感字段(如 password、__meta、_id)后传给下游使用。
配合校验避免运行时错误
解构对 null 或 undefined 源对象会直接报错,所以提取前建议加一层保护:
- 用空对象兜底:
const { password, ...safe } = user ?? {}; - 或提前判断:
if (user && typeof user === 'object') { const { password, ...safe } = user; } - 注意:
?? {}不会修复原型链污染或不可枚举属性问题,仅防空值崩溃
与 Object.assign 对比的适用场景
若目标是“剔除几个字段”,解构 + rest 更简洁清晰;若目标是“保留几个字段”,则更适合用 Object.assign 或手动构造:
- ✅ 解构 + rest:语义明确,“去掉这些,其余全留”,适合已知要剔除的固定 key
- ❌ 不支持动态 key:不能写
const { [keyToRemove], ...rest } = obj(语法非法) - ⚠️ 注意嵌套:rest 只处理顶层,
safeData.profile.city = 'Beijing'仍会影响user.profile.city
简单封装成可复用函数
如果多个地方需要类似逻辑,可以封装一个单层剔除工具(不依赖第三方库):
const omit = (obj, keys) => {
if (!obj || typeof obj !== 'object') return {};
const result = { ...obj };
keys.forEach(key => delete result[key]);
return result;
};
// 使用:const safe = omit(user, ['password', 'token']);
这个函数本质是扩展运算符浅拷贝 + 删除,行为和解构 rest 一致,但支持传入数组形式的字段名,更灵活。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











