javascript浅拷贝本身不自带过滤功能,但可通过解构赋值(排除已知键)、object.keys+reduce(动态黑名单过滤)或object.fromentries+filter(语义清晰的现代写法)实现带排除逻辑的浅拷贝,所有方式均只处理顶层属性且不复制引用类型内部。

JavaScript 中浅拷贝本身不自带过滤功能,但可以通过组合对象解构、Object.keys + reduce、或 Object.fromEntries 等方式,在拷贝过程中跳过指定属性,实现“带排除逻辑的浅拷贝”。
用解构赋值 + 剩余参数排除(最简洁,适合已知要排除的键)
适用于明确知道哪些字段不需要拷贝的场景,代码直观、性能好:
例如排除 id 和 createdAt:
const original = { id: 1, name: 'Alice', age: 30, createdAt: '2023-01-01' };
const { id, createdAt, ...shallowCopy } = original;
// shallowCopy => { name: 'Alice', age: 30 }
注意:这仅适用于对象顶层属性,且必须提前知道要排除的键名。
用 Object.keys + reduce 动态过滤(灵活通用)
适合运行时决定排除哪些属性(比如传入一个黑名单数组):
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
function shallowCopyWithout(obj, excludeKeys) {
return Object.keys(obj).reduce((acc, key) => {
if (!excludeKeys.includes(key)) {
acc[key] = obj[key];
}
return acc;
}, {});
}
const original = { a: 1, b: 2, c: 3, d: 4 };
const copy = shallowCopyWithout(original, ['b', 'd']);
// copy => { a: 1, c: 3 }
这是真正的浅拷贝:所有值都是直接赋值,引用类型(如数组、对象)仍共享内存地址。
用 Object.fromEntries + filter(现代写法,语义清晰)
利用 Object.entries 转为键值对数组,过滤后再转回对象:
function shallowCopyExclude(obj, excludeKeys) {
return Object.fromEntries(
Object.entries(obj).filter(([key]) => !excludeKeys.includes(key))
);
}
const user = { token: 'abc', email: 'a@b.com', password: '123' };
const safeCopy = shallowCopyExclude(user, ['token', 'password']);
// safeCopy => { email: 'a@b.com' }
和 reduce 方案效果一致,可读性更强,但需注意兼容性(IE 不支持)。
⚠️ 注意:这些都不是深拷贝
以上所有方法都只处理对象第一层属性:
- 基础类型(
string、number、boolean)值被复制 - 引用类型(
Array、Object、Date等)只复制引用,原对象与拷贝对象仍共用同一份底层数据 - 若需排除嵌套属性,需配合递归或专用深拷贝库(如 Lodash 的
omit或cloneDeepWith)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










