🧠 ES6 解构赋值 学习笔记

269 阅读3分钟

一、什么是解构赋值?

解构赋值(Destructuring Assignment) 是 ES6 中新增的一种语法,允许我们从数组或对象中提取数据,并赋值给对应的变量。
它让代码更简洁、可读性更强。


二、数组解构

✅ 基本用法

let [a, b] = [10, 20];
console.log(a); // 10
console.log(b); // 20

🔁 顺序决定值

数组解构是按 位置顺序 匹配的:

let [x, y] = ['苹果', '香蕉'];
// x -> 苹果,y -> 香蕉

💡 默认值

如果某个位置没有值(即 undefined),可以设置默认值:

let [x = 1] = [];       // x = 1
let [y = 2] = [undefined]; // y = 2
let [z = 3] = [null];     // z = null(不会使用默认值)

⚠️ 只有当值严格等于 undefined 时才会使用默认值(使用 === 判断)。

📌 惰性求值

默认值是一个表达式时,只有在需要的时候才会执行(惰性求值):

function f() {
  console.log('aaa');
}
let [x = f()] = [1]; // 不会执行 f()

三、对象解构

✅ 基本用法

对象解构是按 属性名匹配 的:

let { name, age } = { name: 'Alice', age: 25 };
console.log(name); // Alice
console.log(age);  // 25

🔄 变量名必须和属性名一致

否则拿不到值:

let { username } = { name: 'Alice' }; 
console.log(username); // undefined

💡 重命名:给变量取不同的名字

使用冒号 : 来重命名变量:

let { name: fullName } = { name: 'Bob' };
console.log(fullName); // Bob

📌 默认值

也可以为对象属性设置默认值:

let { x = 3 } = {};        // x = 3
let { y = 5 } = { y: 10 }; // y = 10

🔗 可以引用已声明的变量

默认值可以引用前面已经声明的变量:

let { x = 1, y = x } = {};
console.log(y); // 1

🧱 嵌套结构

对象也可以嵌套解构:

let obj = {
  p: [
    'Hello',
    { y: 'World' }
  ]
};

let { p: [x, { y }] } = obj;
console.log(x); // Hello
console.log(y); // World

四、特殊技巧 & 注意事项

🚫 已声明变量用于解构时要加括号

let x;
({x} = {x: 1}); // 正确写法

如果不加括号,会被当作代码块报错。

🧩 解构赋值可以不绑定任何变量

虽然没什么实际意义,但语法上合法:

({} = [1, 2, 3]);
({} = 'abc');

🧮 对数组进行对象解构

数组本质也是对象,所以可以对它进行对象属性解构:

let arr = [10, 20, 30];
let { 0: first, [arr.length - 1]: last } = arr;

console.log(first); // 10
console.log(last);  // 30

五、实用场景

🎯 提取模块方法

const { log } = console;
log('Hello'); // 等价于 console.log

🧮 数学函数简化

let { sin, cos } = Math;
console.log(sin(0)); // 0

📦 函数参数解构

function greet({ name, age }) {
  console.log(`你好,${name},今年${age}岁`);
}

greet({ name: 'Tom', age: 18 }); // 输出:你好,Tom,今年18岁

六、顶层对象与全局变量

在浏览器中,顶层对象是 window;在 Node.js 中是 global

ES5 中:

  • 全局变量和 window 属性是一回事。
var a = 1;
console.log(window.a); // 1

ES6 中:

  • varfunction 声明的变量仍是顶层对象的属性;
  • letconstclass 声明的变量不再是顶层对象的属性。
let x = 10;
console.log(window.x); // undefined(浏览器环境)

七、继承属性也能被解构到

const obj1 = {};
const obj2 = { foo: 'bar' };
Object.setPrototypeOf(obj1, obj2);

const { foo } = obj1;
console.log(foo); // "bar"(来自原型链)

✅ 总结一句话:

解构赋值是一种从数组或对象中“拆出”数据并赋值给变量的语法糖,它可以让你更优雅地操作数据结构,写出更清晰、更现代的 JavaScript 代码。