在JavaScript中,大括号 {} 在不同场景下有不同的用法,尤其是在变量声明和模块导入时,其作用和含义有明显区别。下面将详细解析这两种场景下大括号的用法。

一、声明变量时的大括号用法(解构赋值)

在变量声明场景下,大括号{}主要用于 对象解构赋值 ,这是ES6引入的特性,用于从对象中提取属性并赋值给变量。

1. 基本语法
// 从对象中提取属性并赋值给同名变量
const { name, age } = person;

// 从对象中提取属性并赋值给不同名变量
const { name: userName, age: userAge } = person;

// 设置默认值
const { name, age = 18 } = person;
2. 关键特点
  • 匹配机制 :通过属性名进行匹配,与顺序无关。

  • 变量命名 :默认创建与属性同名的变量,也可使用冒号:重命名。

  • 默认值 :可通过等号=为可能不存在的属性设置默认值。

  • 嵌套解构 :支持从嵌套对象中提取属性。

const user = {
  info: {
    name: "张三",
    address: {
      city: "北京"
    }
  }
};

// 嵌套解构
const { info: { name, address: { city } } } = user;

二、导入模块时的大括号用法(命名导入)

在模块导入场景下,大括号用于 命名导入 ,用于从模块中导入特定的命名导出。

1. 基本语法
// 导入单个命名导出
import { myFunction } from './module.js';

// 导入多个命名导出
import { myFunction, myVariable, myClass } from './module.js';

// 导入并重命名
import { myFunction as func } from './module.js';

// 结合默认导入和命名导入
import myDefault, { myFunction } from './module.js';
2. 关键特点
  • 对应关系 :导入的名称必须与模块中导出的命名一致(除非使用重命名语法)。

  • 只读特性 :导入的命名导出是只读的,不能被修改。

  • 按需加载 :使用命名导入可以只加载需要的部分,有助于Tree Shaking。

  • 导入顺序 :多个命名导入的顺序不影响功能。

三、声明变量与导入模块时大括号用法区别

四、代码示例

// 1. 对象解构赋值示例
const person = {
  name: "李四",
  age: 25,
  job: "开发者"
};

// 解构赋值
const { name, age, job } = person;
console.log(name); // "李四"

// 2. 模块导入示例
// module.js 内容:
// export const utils = { helper: () => console.log('帮助函数') };
// export const config = { apiUrl: 'https://api.example.com' };

// 导入模块中的命名导出
import { utils, config } from './module.js';
utils.helper(); // 输出: "帮助函数"
console.log(config.apiUrl); // "https://api.example.com"

总结

  • 在 变量声明 中使用大括号,是对象解构赋值语法,用于从对象中提取属性并赋值给变量。

  • 在 模块导入 中使用大括号,是命名导入语法,用于从模块中导入特定的命名导出。

  • 这两种用法虽然都使用大括号,但在语法本质、作用和使用规则上有明显区别。

理解这两种场景下大括号的正确用法,是掌握JavaScript现代语法和模块化开发的基础。