可用对象解构配合剩余属性(...rest)剔除敏感字段,如const { password, token, ...safeUser } = user;仅浅层剔除自身可枚举属性,需校验null/undefined。

可以用对象解构配合剩余属性(...rest)直接剔除敏感字段,无需手动逐个复制非敏感属性,简洁又安全。
明确要剔除的敏感字段名
先确定哪些字段属于敏感信息(如 password、token、idCard、phone 等),这些字段名将被显式解构出来,不进入 rest 对象。
- 例如用户对象中有
{ name, email, password, token, avatar },想剔除password和token - 就写成:
const { password, token, ...safeUser } = user; - 此时
safeUser自动包含name、email、avatar,不含那两个敏感字段
批量剔除多个字段时,解构顺序不影响结果
...rest 总是收集所有未被显式声明的属性,无论敏感字段写在前面还是后面。
-
const { password, ...safe } = { password: '123', name: 'Alice', email: 'a@b.com' };→safe = { name: 'Alice', email: 'a@b.com' } -
const { name, password, ...safe } = {...};效果一样,safe仍只含未被解构的字段 - 注意:不能重复解构同一字段,否则会报错(如
{ password, password, ...safe })
结合函数封装,复用剔除逻辑
把剔除操作封装成工具函数,避免到处写重复解构语句。
- 简单版(固定剔除):
const omitSensitive = ({ password, token, ...rest }) => rest; - 灵活版(传入字段名数组)需用其他方式(如
Object.keys过滤),因为...rest不支持动态字段名;但固定敏感字段场景下,解构方案最轻量、性能最好 - 使用:
const publicUser = omitSensitive(user);
注意事项与边界情况
这种解构剔除是浅层的,且只对对象自身可枚举属性生效。
- 嵌套对象中的敏感字段(如
user.profile.token)不会被自动剔除,需单独处理内层对象 - 原型链上的属性、不可枚举属性(如
Object.defineProperty(obj, 'secret', { enumerable: false }))不会出现在...rest中,自然也不会被“剔除”——它们本来就不在解构范围内 - 如果原始对象为
null或undefined,解构会报错,建议提前校验:if (user && typeof user === 'object')










