JavaScript中可用剩余运算符(...)在对象解构左侧收集未显式声明的可枚举自身属性,但必须置于解构末尾;它不支持跳过中间键、继承属性或不可枚举属性,也不能用于右侧展开收集。

JavaScript 中不能直接用剩余运算符(...)收集“剩余的对象属性”,因为对象解构中的剩余语法只支持 已知键的提取 + 剩余属性打包为新对象,且要求剩余部分必须是最后一个解构项。
✅ 正确用法:对象解构中用剩余参数收集未被显式声明的属性
剩余运算符在对象解构中用于捕获所有未被单独列出的可枚举自身属性,生成一个新对象:
const user = {
id: 101,
name: 'Alice',
email: 'alice@example.com',
role: 'admin',
active: true
};
// 解构出 id 和 name,其余属性放进 rest 对象
const { id, name, ...rest } = user;
console.log(id); // 101
console.log(name); // 'Alice'
console.log(rest); // { email: 'alice@example.com', role: 'admin', active: true }
⚠️ 注意事项和常见误区
-
剩余项必须是解构模式的最后一个:写成
{ ...rest, id }会报语法错误 -
只收集自身可枚举属性:继承属性、不可枚举属性(如
Object.defineProperty设置的enumerable: false)不会进入...rest -
不支持“跳过中间字段”再收集剩余:比如想跳过
email并收集其他所有,必须显式写出要跳过的键,或改用其他方法(见下条) -
不能用于对象字面量右侧直接“展开剩余”:像
{ ...obj, ...rest }是展开,不是收集;收集行为只发生在解构赋值左侧
? 替代方案:按需筛选剩余属性(例如排除某些字段)
如果需要“除指定键外的所有属性”,但不想逐个写解构名,可用 Object.keys + reduce 或 Object.fromEntries:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const user = { id: 101, name: 'Alice', email: 'a@b.com', role: 'user' };
const exclude = ['id', 'email'];
const rest = Object.fromEntries(
Object.entries(user).filter(([key]) => !exclude.includes(key))
);
// → { name: 'Alice', role: 'user' }
? 小技巧:结合默认值与剩余语法
剩余语法可与默认值共存,适合处理可选配置对象:
立即学习“Java免费学习笔记(深入)”;
function createUser({ name, age = 18, ...options }) {
return {
name,
age,
...options // 如 status、permissions 等动态字段
};
}
createUser({ name: 'Bob', status: 'active', permissions: ['read'] });
// → { name: 'Bob', age: 18, status: 'active', permissions: ['read'] }

















