浅拷贝配合解构赋值的剩余属性语法可快速剔除已知敏感字段生成安全对象,如const { password, token, ...safeUser } = user;safeUser是原对象第一层的浅拷贝,基本类型独立,引用类型仍共享内存。

浅拷贝本身不负责“过滤”,但配合解构赋值的剩余属性语法,能在一层结构内快速剔除已知敏感字段(如 password、token、__meta),生成一个顶层属性被清理过的新对象——这个新对象就是原对象第一层的浅拷贝。
用解构 + rest 一次性剔除固定敏感字段
这是最简洁、语义最清晰的方式,适合字段名确定、结构扁平的场景:
- 写法示例:const { password, token, ...safeUser } = user; —— password 和 token 被单独提取,其余所有自身可枚举属性自动归入 safeUser
- safeUser 是浅拷贝:它的顶层属性(如 id、name、profile)是新对象的自有属性,但值仍是原值
- 基本类型(id: 123)修改不影响原对象;引用类型(profile: { city: 'Beijing' })仍共享地址,safeUser.profile.city = 'Shanghai' 会同步改掉 user.profile.city
用 Object.keys + reduce 灵活控制过滤逻辑
当需要动态判断、或字段名来自变量、或想统一处理 null/undefined 值时,手动遍历更可控:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先定义敏感字段列表:const sensitiveKeys = ['password', 'token', '__temp'];
- 再构建新对象:const safeUser = Object.keys(user).filter(k => !sensitiveKeys.includes(k)).reduce((acc, k) => ({ ...acc, [k]: user[k] }), {});
- 若需跳过 undefined 或 null 值,可在 reduce 内加判断:if (user[k] !== undefined && user[k] != null) acc[k] = user[k];
- 注意:Object.keys() 拿不到不可枚举属性和 Symbol 键;如需支持,改用 Reflect.ownKeys(user) 并配合 Object.getOwnPropertyDescriptor() 判断可枚举性
注意事项与边界情况
这类操作看似简单,但几个细节容易踩坑:
立即学习“Java免费学习笔记(深入)”;
- 源对象为 null 或 undefined 时,解构会直接报错,建议前置校验:if (user && typeof user === 'object')
- 无法过滤原型链上的属性——所有方式默认只处理对象自身的可枚举属性
- 如果对象有嵌套敏感字段(如 user.settings.apiKey),浅拷贝 + 一层过滤无能为力,必须升级到递归深拷贝并配合路径级过滤规则
- 不要误用 JSON.parse(JSON.stringify(obj)) 来“过滤”,它会丢失函数、Date、Symbol、undefined 等,且不是真正意义上的过滤,而是序列化截断
对大多数表单提交、API 请求脱敏等场景,解构 rest 就够用;需要更高灵活性或处理深层/动态字段时,Object.keys + reduce 是更稳妥的选择。

















