在 ES6 之前的 JavaScript 版本中,当我们需要用已存在的变量来创建对象字面量时,常常会遇到代码重复的情况。ES6 引入的对象属性简写语法,正是为了消除这种冗余,让我们的代码变得更简洁、更具表现力。

本篇指南将带您深入理解这一简单而强大的语法糖,并探索它与解构赋值之间的内在联系。

1. 问题场景:冗余的代码

想象一下,你正在编写一个函数,它接收几个参数,然后将它们组合成一个对象返回。在 ES5 中,你可能会这样写:

ES5 的写法 (The Old Way):

function createUser(name, email, age) {
  const user = {
    name: name,
    email: email,
    age: age
  };
  return user;
}

const name = 'Alice';
const age = 30;
const userObject = {
  name: name,
  age: age
};

สังเกตเห็นไหมว่า name: nameage: age 这种模式出现了。属性名和持有其值的变量名是完全相同的。这种重复是多余的,也是 ES6 致力于解决的问题之一。


2. 解决方案:ES6 属性简写 (The Recipe)

ES6 规定,当对象属性名与你希望赋给该属性的变量名相同时,你可以省略冒号和变量名,只写一次即可。

ES6 的写法 (The Modern Way):

function createUser(name, email, age) {
  // 如果键和变量名相同,直接写入变量名即可
  const user = {
    name,
    email,
    age
  };
  return user;
}

const name = 'Alice';
const age = 30;
const userObject = {
  name,
  age
};

console.log(userObject); // { name: 'Alice', age: 30 }

核心规则
在对象字面量 {} 中,如果一个属性需要被赋值的变量与该属性的名称相同,那么你可以只写这个名称,JavaScript 引擎会自动为你展开为 名称: 名称 的形式。


3. 实际应用场景

这种简写语法在现代 JavaScript 开发中无处不在,尤其是在以下场景:

A. 从函数返回对象

这是最常见的场景之一,极大地提升了代码的简洁性。

function getConfiguration(port, host, debugMode) {
  // ... 一些逻辑 ...
  return { port, host, debugMode };
}

const config = getConfiguration(8080, 'localhost', true);
// config -> { port: 8080, host: 'localhost', debugMode: true }
B. 创建包含方法和属性的对象

当函数(方法)和变量一起构成对象时,这种写法同样适用。

const name = 'Super Calculator';

function add(a, b) {
  return a + b;
}

function subtract(a, b) {
  return a - b;
}

const calculator = {
  name,      // 相当于 name: name
  add,       // 相当于 add: add
  subtract   // 相当于 subtract: subtract
};

console.log(calculator.name); // 'Super Calculator'
console.log(calculator.add(5, 3)); // 8
C. 模块导出 (ES Modules / CommonJS)

在组织代码模块时,我们经常需要导出一系列函数或常量。

// utils.js
const PI = 3.14159;
const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);

// 使用属性简写来导出
export { PI, capitalize };

// 在另一个文件中导入
// import { PI, capitalize } from './utils.js';

4. 深度解析:与“解构赋值”的优美对称性

要真正理解属性简写的精髓,我们需要将它与另一个 ES6 重要特性——解构赋值 (Destructuring Assignment)——放在一起看。你会发现它们在设计上是一种优美的“逆操作”。

  • 属性简写 (Shorthand Properties): 将作用域中的多个变量“打包”或“组合”成一个对象

    // 从变量到对象
    const firstName = 'John';
    const lastName = 'Doe';
    
    const person = { firstName, lastName }; // 打包
    
  • 解构赋值 (Destructuring): 从一个对象中“解包”或“提取”属性到作用域中,成为独立的变量

    // 从对象到变量
    const person = { firstName: 'John', lastName: 'Doe' };
    
    const { firstName, lastName } = person; // 解包
    
    console.log(firstName); // 'John'
    console.log(lastName); // 'Doe'
    

结论
属性简写和解构赋值,一个是“封装”,一个是“解构”,共同构成了一套极其强大且符合人体工程学的语法,极大地简化了 JavaScript 中对象与变量之间的相互转换,减少了样板代码。


5. 总结与最终建议

对象属性简写是 ES6 中一个看似微小但影响深远的改进。它完美地体现了现代 JavaScript “减少冗余、增强表达力”的设计哲学。

最终建议
在您的现代 JavaScript 项目中,只要遇到对象属性名与变量名相同的情况,就应该始终使用属性简写语法。这不仅能让你的代码更短,更重要的是,它已经成为社区的标准实践,能让其他开发者更快地阅读和理解你的代码。养成使用它的习惯,是拥抱现代 JavaScript 的一个重要标志。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐