剩余属性(Rest Property)必须位于对象解构末尾,收集自身可枚举字符串键属性为新对象;不可与显式解构项顺序颠倒,不包含原型链或Symbol键,非顶层独立使用,且为浅拷贝。

JavaScript 中用剩余属性(Rest Property)收集未被解构的动态参数,需配合对象解构语法,且必须放在解构模式的**最后**。它会把对象中所有尚未被显式声明的可枚举自有属性,以新对象形式打包赋值。
基本写法:用 ...rest 收集剩余属性
剩余属性不是单独使用的语法,而是对象解构中的一个特殊位置标记:
- 只能出现在解构语句的末尾,否则报错(如
{ a, ...rest, b }不合法) -
...rest后面必须跟一个标识符(变量名),不能是表达式 - 它收集的是当前层级的“未被取走”的属性,不递归、不跳过嵌套
示例:
const user = { name: 'Alice', age: 30, city: 'Beijing', role: 'admin' };const { name, age, ...info } = user;
console.log(name); // 'Alice'
console.log(age); // 30
console.log(info); // { city: 'Beijing', role: 'admin' }
与默认值、重命名共存时的顺序规则
剩余属性可以和默认值、别名(重命名)一起使用,但顺序不可乱:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 显式解构项(含重命名
oldName: newName和默认值prop = defaultValue)必须在前 -
...rest必须在最后,且只能出现一次
示例:
const data = { id: 123, title: 'Hello', tags: ['js'], extra: true };const {
id,
title: headline,
tags = [],
...others
} = data;
console.log(headline); // 'Hello'
console.log(tags); // ['js']
console.log(others); // { extra: true }
注意:只收集自身可枚举属性,不包括原型链或 Symbol 键
剩余属性遵循 Object.keys() 的行为逻辑:
- 仅遍历对象自身的、可枚举的字符串键属性
- 忽略继承来的属性(如来自
Object.prototype) - 忽略 Symbol 类型的键(即使它是自身的)
例如:
const base = { toString: 'nope' };const obj = { ...base, a: 1, b: 2, [Symbol('x')]: 'sym' };
const { a, ...rest } = obj;
console.log(rest); // { b: 2 } —— toString 被忽略,Symbol 键也被忽略
常见误用与避坑
-
不能在顶层对象字面量中直接用 ...rest:像
{ ...rest } = obj是非法的,必须有至少一个明确解构项(哪怕只是占位) -
不能用于数组解构的“剩余属性”:数组用的是剩余元素(
...rest),但那是 Rest Element,语义和行为不同;对象才叫 Rest Property -
浅拷贝:rest 对象是新对象,但其属性值仍是原引用,修改
rest.nestedObj.x会影响原对象

















