展开运算符(...)无法跳过属性,需先剔除再展开;常用解构+剩余参数法(如const { password, token, ...safeuser } = user),或object.keys+reduce动态排除,亦可封装omit函数;但均不处理嵌套、symbol及不可枚举属性。

直接用展开运算符(...)本身无法跳过属性,它会把所有可枚举属性一股脑复制过去。想忽略特定属性,得先剔除它们,再展开剩余部分。
用解构赋值配合剩余参数剔除
这是最常用也最直观的方式:在解构时把要忽略的字段单独取出来,剩下的用剩余参数收集,再展开。
-
写法示例:
const { password, token, ...safeUser } = user;<br>console.log(safeUser); // 不含 password 和 token - 适用于对象结构已知、忽略字段明确的场景
- 注意:只剔除顶层属性;嵌套对象需额外处理
用 Object.keys + reduce 构建新对象
适合动态决定忽略哪些字段,比如从配置列表读取要排除的 key。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
写法示例:
const excludeKeys = ['password', 'token'];<br>const safeUser = excludeKeys.reduce((obj, key) => {<br> const { [key]: _, ...rest } = obj;<br> return rest;<br>}, { ...user }); - 更灵活,支持运行时控制排除项
- 性能略低,简单场景不推荐过度使用
封装成可复用的 omit 工具函数
如果多个地方都要忽略属性,抽成函数更干净。
-
简易实现:
const omit = (obj, keys) => {<br> return Object.fromEntries(<br> Object.entries(obj).filter(([k]) => !keys.includes(k))<br> );<br>};<br>const safeUser = { ...omit(user, ['password', 'token']) }; - 支持数组传入多个键名,语义清晰
- 可搭配 Lodash 的
omit使用,但小项目不必引入依赖
注意深层嵌套或 Symbol 属性的情况
展开运算符默认只处理自身可枚举属性,不递归,也不处理 Symbol 键。
- 要忽略嵌套对象里的字段,得对子对象单独解构或递归处理
- Symbol 属性不会被
...obj或Object.keys()捕获,需用Object.getOwnPropertySymbols()单独处理 - 不可枚举属性(如
Object.defineProperty设置的)同样不会被展开










