JavaScript解构动态属性名需用计算属性语法[key],支持字符串、变量及默认值和重命名;不支持一次解构多个未知键,应改用obj[key]或封装函数处理。

JavaScript 中解构动态属性名的对象属性,核心是用计算属性名 + 解构赋值,不能直接在解构左侧写变量名,而要借助方括号语法配合字符串或变量。
用方括号写计算属性名
对象解构的左侧支持计算属性语法 [key],其中 key 是一个表达式(比如字符串字面量或变量):
const obj = { userName: 'Alice', age: 30 };
const key = 'userName';
// ✅ 正确:用 [key] 解构动态属性
const { [key]: name } = obj;
console.log(name); // 'Alice'
// ✅ 也可直接写字符串
const { ['age']: userAge } = obj;
console.log(userAge); // 30
解构多个动态键(需多次或结合其他方式)
解构语法本身不支持“一次展开多个未知键”,但可以组合使用:
- 单个动态键:直接用
{ [key]: alias } - 多个已知键 + 一个动态键:混合写法
- 纯动态键列表:推荐用
obj[key]取值,而非强制解构
const obj = { id: 123, status: 'active', extra: 'data' };
const dynamicKeys = ['id', 'status'];
// ❌ 无法这样写:{ [dynamicKeys[0]], [dynamicKeys[1]] } = obj
// ✅ 推荐方式:分别解构或用 reduce / map
const id = obj[dynamicKeys[0]];
const status = obj[dynamicKeys[1]];
// ✅ 或封装成函数复用
const pick = (obj, keys) => keys.reduce((acc, k) => ({ ...acc, [k]: obj[k] }), {});
console.log(pick(obj, ['id', 'extra'])); // { id: 123, extra: 'data' }
配合默认值和重命名
动态解构同样支持默认值和别名,写法一致:
const obj = { count: 42 };
const key = 'count';
const { [key]: num = 0 } = obj; // 有值,num = 42
const { ['missing'] : value = 'default' } = obj; // 无该属性,value = 'default'
// 也可以先重命名再设默认值
const { ['score']: points = 100 } = { }; // points = 100
注意点:key 必须是字符串或可转为字符串的值
计算属性名内部会调用 ToString(),所以数字、布尔等也合法,但 Symbol 需显式转换:
-
{ [123]: a }→ 等价于{ '123': a } -
{ [true]: b }→ 等价于{ 'true': b } -
{ [Symbol('x')]: c }→ ❌ 报错;应写{ [Symbol('x').toString()]: c }(但通常不建议用 Symbol 做动态解构键)


















