【ES6】day30-destructuring

作者:mario 发布时间: 2026-08-26 阅读量:5 评论数:0

第三十天:解构赋值 — 从对象和数组中优雅取值

蜗牛往上爬 · 前端工业可视化学习笔记 第 30 篇
解构赋值是 ES6 最常用的语法之一——从数组按位置、从对象按属性名一次性取出多个值。交换变量一行搞定、函数参数直接解构、从 API 数据里优雅提取字段。今天把数组解构和对象解构都吃透。


目录


一、数组解构:按位置取值

// 传统写法
var a = 1, b = 2, c = 3;

// 解构:等号左边是"模式",按位置对应
let [x, y, z] = [1, 2, 3];
console.log(x);  // 1
console.log(y);  // 2
console.log(z);  // 3

数组按位置对象按属性名——这是两者的核心区别。


二、交换变量、跳过、默认值、rest

// ⭐ 交换变量(经典场景,一行搞定)
let a = 1, b = 2;
[a, b] = [b, a];
console.log(a);  // 2
console.log(b);  // 1

// 跳过元素:逗号占位
let [, , third] = [1, 2, 3];
console.log(third);  // 3

// 嵌套解构
let [x, [y, z]] = [1, [2, 3]];
console.log(x, y, z);  // 1 2 3

// 默认值:右边为 undefined 时使用
let [m = "默认", n] = [undefined, 2];
console.log(m);  // "默认"

// rest 剩余:收集剩余元素成数组
let [first, ...rest] = [1, 2, 3, 4];
console.log(first);  // 1
console.log(rest);   // [2, 3, 4]

rest 的威力:替代 arguments 写"任意参数求和":

// arguments 是伪数组(没有 map/filter)
function sum() {
  return Array.prototype.reduce.call(arguments, function (a, b) { return a + b; }, 0);
}

// rest 是真数组,直接 reduce
function sumES6(...nums) {
  return nums.reduce((a, b) => a + b, 0);
}
console.log(sumES6(1, 2, 3, 4));  // 10

三、对象解构:按属性名取值

// 传统写法
var device = { id: "CNC-001", name: "数控机床", temp: 65 };
var id = device.id;
var name = device.name;

// 解构:按属性名匹配(顺序无所谓)
let { id, name, temp } = { id: "CNC-001", name: "数控机床", temp: 65 };
console.log(id);    // "CNC-001"
console.log(name);  // "数控机床"

四、重命名与默认值

// 重命名:把 device_id 提取为 id
const data = { device_id: "CNC-001", temp: 65 };
const { device_id: id, temp } = data;
console.log(id);    // "CNC-001"

// 默认值:属性不存在或 undefined 时用
const { online = true } = { temp: 65 };
console.log(online);  // true

// 重命名 + 默认值
const { name: displayName = "未知设备" } = {};
console.log(displayName);  // "未知设备"

五、嵌套解构

const device = {
  id: "CNC-001",
  location: { workshop: "一号车间", row: 3, column: 5 },
  maintenance: { nextDate: "2026-10-01" }
};

// 提取嵌套属性
const { location: { workshop, row }, maintenance: { nextDate } } = device;
console.log(workshop);  // "一号车间"
console.log(row);       // 3
console.log(nextDate);  // "2026-10-01"

六、函数参数解构

这是最常用的解构场景——参数直接解构对象:

// 传统写法
function showDevice(info) {
  console.log(info.name + ":" + info.temp + "°C");
}

// 解构写法
function showDevice({ name, temp }) {
  console.log(name + ":" + temp + "°C");
}
showDevice({ name: "CNC-001", temp: 65 });  // "CNC-001:65°C"

// 配合默认值(参数整体默认 = {},字段再各自默认)
function renderDevice({ id, name = "未知设备", temp = 0 } = {}) {
  console.log(id + " - " + name + " - " + temp + "°C");
}
renderDevice({ id: "CNC-001" });        // "CNC-001 - 未知设备 - 0°C"
renderDevice();                          // "undefined - 未知设备 - 0°C"

工业大屏里,函数参数往往是一个"配置对象"(options),解构参数 + 默认值是最优雅的写法。


七、注意事项

// 1. 解构 null/undefined 报错
// let { a } = null;  // ❌ TypeError

// 2. 已声明变量的解构要加括号(防止被当代码块)
let x;
({ x } = { x: 1 });  // ✅
console.log(x);  // 1

// 3. 不存在的属性 → undefined
let { pressure } = { temp: 65 };
console.log(pressure);  // undefined

// 4. 变量名不能重复
// let { a, a } = { a: 1 };  // ❌ SyntaxError

八、综合实战:从 API 提取字段

后端返回设备详情(字段很多),用解构一次提取大屏需要的字段:

const apiDevice = {
  id: "CNC-001",
  name: "数控机床",
  model: "VMC850",
  temperature: 65.3,
  speed: 1200,
  status: "运行中",
  online: true,
  location: { workshop: "一号车间", row: 3 },
  maintenance: { nextDate: "2026-10-01" }
};

// 重命名 + 嵌套 + 默认值 一站式提取
const {
  id,
  name,
  temperature: temp,       // 重命名
  speed,
  online = false,
  location: { workshop },  // 嵌套
  maintenance: { nextDate } // 嵌套
} = apiDevice;

console.log(`
设备:${name}(${id})
车间:${workshop}
温度:${temp}°C,转速:${speed}rpm
状态:${status}(${online ? "在线" : "离线"})
下次保养:${nextDate}
`);

配合 for…of 遍历对象数组

const deviceList = [
  { id: "CNC-001", temp: 65 },
  { id: "AGV-002", temp: 42 }
];

// 遍历时直接解构
for (const { id, temp } of deviceList) {
  console.log(id + ":" + temp + "°C");
}

九、总结

场景

写法

用途

数组解构

let [a, b] = arr

按位置取值

交换变量

[a, b] = [b, a]

一行交换

rest

let [first, ...rest] = arr

收集剩余

对象解构

let {name} = obj

按属性名取值

重命名

let {a: x} = obj

换变量名

默认值

let {a = 1} = obj

缺省兜底

嵌套

let {a: {b}} = obj

提取深层

参数解构

fn({name})

优雅传参

🎯 解构赋值是 ES6 使用频率最高的语法之一。明天开始学函数扩展(箭头函数)和字符串/数组扩展——代码将全面"现代化"。

评论