ES6 解构赋值与对象简写:让 JavaScript 更优雅、更高效

88 阅读4分钟

2015 年,ES6(ECMAScript 2015)横空出世,标志着 JavaScript 正式迈入现代编程语言行列
它不仅弥补了早期 JS 在工程化、可读性、安全性上的短板,更引入了如 解构赋值展开运算符对象属性简写 等强大特性,极大提升了开发效率与代码美感。


一、为什么需要 ES6?

在 ES6 之前,JavaScript 被诟病为“玩具语言”:

  • 没有块级作用域(var 变量提升)
  • 无法定义类(class 关键字缺失)
  • 函数参数处理笨拙
  • 对象和数组操作冗长

而 ES6 的出现,让 JS 具备了企业级开发能力,成为前端乃至全栈(Node.js)、AI 工具链(如 Trae、Vite 插件)的首选语言。

核心价值优雅 + 表达力 + 工程友好


二、解构赋值(Destructuring Assignment)

解构是一种从数组或对象中按结构提取值并赋给变量的语法。它让“一次性声明多个变量”变得极其简洁。

1. 数组解构

javascript
编辑
const users = ['Darvin Ham', 'James', 'Luka', 'Davis', 'Ayton'];

// 提取第一个为 captain,其余为 players
const [captain, ...players] = users;

console.log(captain); // 'Darvin Ham'
console.log(players); // ['James', 'Luka', 'Davis', 'Ayton']
  • [a, b, c] = arr:按位置匹配
  • ...rest剩余运算符(Rest),收集剩余元素(必须放在最后)

应用场景

  • 函数返回多个值
  • 快速交换变量:[a, b] = [b, a]
  • 处理 API 返回的数组数据

💡 字符串也可被解构(因其可迭代):

javascript
编辑
const [a1, b2, c3, d4, e6] = 'hello';
console.log(a1, b2, c3, d4, e6); // 'h' 'e' 'l' 'l' 'o'

2. 对象解构

javascript
编辑
const obj = {
    name: '刘翔平',
    age: 20,
    sex: 'box',
    like: {
        n: '唱跳'
    }
};

// 解构嵌套对象,并重命名(name1 不存在,故为 undefined)
let { name1, age, like: { n } } = obj;

console.log(name1); // undefined(obj 中无 name1 属性)
console.log(age);   // 20
console.log(n);     // '唱跳'
⚠️ 常见误区:
  • 左边变量名必须与对象属性名一致(除非使用别名):

    javascript
    编辑
    let { name: realName } = obj; // realName = '刘翔平'
    
  • 若属性不存在,默认值为 undefined,可通过默认值避免:

    javascript
    编辑
    let { name = '匿名', score = 0 } = obj;
    

优势

  • 避免重复写 obj.xxx
  • 支持深度嵌套解构
  • 提升函数参数可读性(如 React props)

三、对象属性简写(Shorthand Property)

变量名与对象属性名相同时,ES6 允许省略冒号和值:

javascript
编辑
const sex = 'box';
const name = '刘翔平';

// 传统写法
const obj1 = { name: name, sex: sex };

// ES6 简写
const obj2 = { name, sex };

效果完全相同,但代码更简洁、意图更清晰。

💡 特别适合

  • 模块导出:export { func, config }
  • 构建配置对象:createUser({ id, name, email })

四、展开运算符(Spread Operator)...

虽然你提到的是 ... 在解构中的 Rest 用法(收集剩余项),但它还有强大的 Spread 用法(展开):

javascript
编辑
// 数组合并
const team = [captain, ...players];

// 对象合并(浅拷贝)
const profile = { ...obj, city: '南昌' };

// 函数调用展开参数
Math.max(...[1, 2, 3]); // 等价于 Math.max(1, 2, 3)

🔁 Rest vs Spread

  • Rest(收集):[a, ...rest] = arr → 用于解构左侧
  • Spread(展开):func(...args) → 用于表达式中

五、大厂面试高频考点

1. 以下代码输出什么?

javascript
编辑
const { a: x = 10, b: y = 20 } = { a: 30 };
console.log(x, y);

30 20
解析:a 存在,取值 30;b 不存在,使用默认值 20。


2. 如何安全地解构可能为 null/undefined 的对象?

:使用逻辑或提供默认空对象:

javascript
编辑
const { name } = user || {};
// 或使用可选链(ES2020)
const name = user?.name;

3.  ... 在函数参数中叫什么?有什么限制?

:叫 剩余参数(Rest Parameters),必须是最后一个参数

js
编辑
function sum(first, ...others) { } // ✅
function sum(...others, last) { } // ❌ 语法错误

六、总结:ES6 让代码“少即是多”

特性传统写法ES6 写法优势
多变量赋值let a = arr[0], b = arr[1]let [a, b] = arr简洁、防错
对象属性{ name: name }{ name }减少重复
剩余元素手动 slice...rest表达力强
默认值`name = name'匿名'`

🌟 掌握 ES6 解构与简写,不仅是语法升级,更是思维方式的进化
从“操作数据”转向“描述结构” ,让代码更接近自然语言,也更契合 AI 编程时代对“清晰上下文”的要求。


📚 建议实践
下次写 React 组件时,试试用解构获取 props;
处理 API 响应时,用对象解构直接提取所需字段——你会发现,代码真的可以“少写一半”。