浅拷贝本身不直接过滤属性,但通过解构赋值的剩余属性语法(如 const { unwanted, ...rest } = obj)可一次性提取指定字段并生成仅含其余属性的新对象,该 rest 对象是原对象第一层的浅拷贝,基本类型值拷贝、引用类型地址拷贝,适用于已知固定字段剔除场景。

浅拷贝本身不直接“过滤”属性,但配合解构赋值中的剩余属性语法(...),可以自然实现局部属性剔除——本质是提取指定字段 + 自动构造一个仅含其余属性的新对象,这个新对象就是对原对象第一层的浅拷贝。
解构 + rest 实现剔除的核心逻辑
写法如 const { unwanted, ...rest } = obj,它不是先拷贝再删,而是一次性完成两件事:
- 从
obj中读取所有自身可枚举属性(跳过原型链、Symbol、不可枚举属性) - 把
unwanted对应的值单独取出,赋给变量unwanted - 把其余所有属性(包括嵌套对象、数组等)原样复制到一个新对象
rest中
rest 是浅拷贝结果,不是“纯解构”
rest 对象确实是浅拷贝:它的顶层属性是新对象的自有属性,但值仍是原值。这意味着:
- 基本类型(字符串、数字、布尔)是值拷贝,修改
rest.x不影响obj.x - 引用类型(对象、数组)仍是地址拷贝,
rest.profile.city = 'Shanghai'会同步改变obj.profile.city - 它不处理
null或undefined的源对象——直接报错,需提前校验
对比其他过滤方式的适用场景
这种写法适合已知要剔除的字段名、结构简单、且只操作一层的场景:
- ✅ 快速剔除 1–3 个固定字段,比如去掉
password、token、__meta - ✅ 语义清晰,一行代码表达“取这些,其余归入 rest”
- ❌ 不支持动态字段名(如变量存着要剔除的 key)
- ❌ 无法跳过不可枚举属性或 Symbol 键(需用
Reflect.ownKeys+ 手动遍历)
安全使用的注意事项
避免踩坑,建议加一层防护:
- 对
obj做非空判断:obj && typeof obj === 'object' - 若需深层隔离,剔除后对
rest单独深拷贝(如structuredClone(rest)) - 想同时重命名+过滤?改用解构重命名 + 字面量组合:
const { id: userId, name: fullName, ...rest } = obj; const result = { userId, fullName, ...rest };
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











