ES6 是前端开发的 “现代语法基石”,Vue3、TS、工程化开发都基于 ES6 语法构建。以下按「核心语法→实战技巧→避坑指南」梳理,覆盖所有高频知识点,贴合 Vue3+TS 实际开发场景。

一、核心语法全解析(按使用频率排序)

1. 变量声明:let/const(替代 var)

核心知识点

表格

特性

let

const

var(废弃)

作用域

块级作用域

块级作用域

函数级作用域

重复声明

不允许

不允许

允许

变量提升

存在(暂时性死区)

存在(暂时性死区)

存在

赋值

可修改

不可修改(引用类型内部可改)

可修改

实战技巧

javascript

运行

// 1. 优先用 const,需要修改时用 let(减少变量突变)
const BASE_URL = 'https://api.crm.com'; // 常量大写
let pageNum = 1; // 变量小写

// 2. 避免块级作用域陷阱(if/for 内声明的变量外部不可访问)
if (true) {
  const name = '张三';
}
console.log(name); // 报错(块级作用域隔离)

// 3. const 引用类型的“不可改”是指引用,内部属性可改(Vue3 响应式常用)
const user = { name: '张三' };
user.name = '李四'; // 合法(常用:Pinia/React 状态修改)
// user = {}; // 报错(引用不可改)

2. 解构赋值(简化数据提取)

核心知识点
  • 数组解构:按位置提取;对象解构:按键名提取;支持默认值、剩余运算符。
  • 支持嵌套解构、函数参数解构、重命名。
实战技巧

javascript

运行

// 1. 数组解构(Vue3 组合式 API 常用)
const [a, b, ...rest] = [1, 2, 3, 4]; // a=1, b=2, rest=[3,4]
const [, y] = [10, 20]; // 只取第二个值(常用:坐标/尺寸提取)

// 2. 对象解构(接口数据/组件 Props 常用)
const { name, age = 18, address: addr = '未知' } = { name: '张三' }; 
// name=张三, age=18, addr=未知

// 3. 函数参数解构(Vue 组件 Props/请求参数常用)
const getUser = ({ id, name }) => console.log(id, name);
getUser({ id: 1, name: '张三' });

// 4. 嵌套解构(后端返回的嵌套数据)
const res = { data: { list: [1,2,3], total: 100 } };
const { data: { list, total } } = res; // 直接提取嵌套属性

// 5. 解构交换变量(无需临时变量)
let x = 1, y = 2;
[x, y] = [y, x]; // x=2, y=1

3. 模板字符串(`)

核心知识点
  • 支持多行字符串、变量插值 ${}、表达式嵌入。
  • 避免拼接字符串的繁琐,减少语法错误。
实战技巧

javascript

运行

// 1. 多行字符串(Vue 模板/配置文件常用)
const html = `
  <div class="customer">
    <p>${name}</p>
    <p>${age} 岁</p>
  </div>
`;

// 2. 表达式嵌入(避免 + 拼接)
const price = 100;
const desc = `总价:${price * 1.08} 元(含8%税)`;

// 3. 函数调用嵌入(动态内容)
const formatTime = (time) => new Date(time).toLocaleString();
const log = `操作时间:${formatTime(Date.now())}`;

4. 箭头函数(=>)

核心知识点
  • 简化函数写法,没有自己的 this(继承外层 this);
  • 没有 arguments、不能作为构造函数(不能 new);
  • 单参数可省略 (),单返回值可省略 {} 和 return。
实战技巧

javascript

运行

// 1. 简化回调函数(数组方法/异步操作常用)
const arr = [1,2,3];
const double = arr.map(item => item * 2); // 简洁写法

// 2. 解决 this 指向问题(Vue 组件/定时器常用)
// 错误示例(普通函数 this 丢失)
const obj = {
  name: '张三',
  fn: function() {
    setTimeout(function() {
      console.log(this.name); // undefined
    }, 1000);
  }
};
// 正确示例(箭头函数继承外层 this)
const obj2 = {
  name: '张三',
  fn: function() {
    setTimeout(() => {
      console.log(this.name); // 张三
    }, 1000);
  }
};

// 3. 避免滥用:对象方法/原型方法不能用箭头函数(this 指向错误)
const user = {
  name: '张三',
  sayHi: () => console.log(this.name) // 错误:this 指向 window
};

5. 扩展运算符(...)

核心知识点
  • 数组扩展:展开数组、合并数组、转伪数组为真数组;
  • 对象扩展:展开对象、合并对象(浅拷贝);
  • 函数参数扩展:接收剩余参数、传递多个参数。
实战技巧

javascript

运行

// 1. 数组扩展(Vue 列表操作常用)
const arr1 = [1,2];
const arr2 = [3,4];
const newArr = [...arr1, ...arr2]; // 合并数组:[1,2,3,4]
const copyArr = [...arr1]; // 浅拷贝数组(替代 slice())

// 2. 对象扩展(Vue Props/状态合并常用)
const obj1 = { a: 1 };
const obj2 = { b: 2 };
const newObj = { ...obj1, ...obj2, a: 3 }; // 合并并覆盖:{a:3, b:2}
const copyObj = { ...obj1 }; // 浅拷贝对象(替代 Object.assign)

// 3. 伪数组转真数组(DOM 操作/arguments 常用)
const nodes = document.querySelectorAll('div');
const nodeArr = [...nodes]; // 转数组后可使用 map/filter 等方法

// 4. 函数剩余参数(接收任意数量参数)
const sum = (...args) => args.reduce((a, b) => a + b, 0);
sum(1,2,3); // 6

6. 类(class)

核心知识点
  • 语法糖,底层仍是原型继承;
  • 包含构造函数 constructor、实例方法、静态方法、继承 extends/super
  • TS 中强化类型,支持私有属性 #、访问器 get/set
实战技巧

javascript

运行

// 1. 基础类定义(封装工具类/请求类常用)
class Request {
  constructor(baseURL) {
    this.baseURL = baseURL;
  }
  get(url) {
    return fetch(`${this.baseURL}${url}`);
  }
  static create(baseURL) { // 静态方法:工厂模式
    return new Request(baseURL);
  }
}
const request = Request.create('https://api.crm.com');

// 2. 继承(扩展通用类)
class AdminRequest extends Request {
  constructor() {
    super('https://admin.crm.com'); // 调用父类构造器
  }
  getAdminData(url) {
    return this.get(`/admin${url}`); // 复用父类方法
  }
}

// 3. TS 私有属性(封装内部逻辑)
class User {
  #password; // 私有属性:外部不可访问
  constructor(name, pwd) {
    this.name = name;
    this.#password = pwd;
  }
  checkPwd(pwd) {
    return this.#password === pwd;
  }
}

7. 模块化(import/export)

核心知识点
  • ES 模块规范,替代 CommonJS(require/module.exports);
  • 支持默认导出 export default、命名导出 export const、按需导入 import { xx }
  • Vue3+Vite 天然支持,Tree-Shaking 依赖模块化。
实战技巧

javascript

运行

// 1. 导出(utils/request.ts)
// 命名导出(多个值)
export const BASE_URL = 'https://api.crm.com';
export const formatDate = (time) => new Date(time).toLocaleString();
// 默认导出(单个值)
export default class Request {}

// 2. 导入(组件中)
import Request, { BASE_URL, formatDate } from './utils/request';
// 按需导入 + 重命名
import { formatDate as fDate } from './utils/request';
// 动态导入(路由懒加载/Vue 异步组件)
const UserComponent = () => import('./components/User.vue');

// 3. 导入整个模块
import * as utils from './utils/request';
utils.formatDate(Date.now());

8. 异步编程:Promise

核心知识点
  • 解决回调地狱,支持链式调用 then/catch/finally
  • 状态:pending(进行中)、fulfilled(成功)、rejected(失败);
  • 静态方法:Promise.all/Promise.race/Promise.resolve/Promise.reject
实战技巧

javascript

运行

// 1. 基础用法(封装异步请求)
const getCustomer = (id) => {
  return new Promise((resolve, reject) => {
    fetch(`/api/customer/${id}`)
      .then(res => res.json())
      .then(data => resolve(data))
      .catch(err => reject(err));
  });
};

// 2. 链式调用(避免回调地狱)
getCustomer(1)
  .then(data => getOrder(data.orderId))
  .then(order => console.log(order))
  .catch(err => console.error(err));

// 3. Promise.all(并行请求,全部成功才返回)
const [customers, orders] = await Promise.all([
  getCustomerList(),
  getOrderList()
]);

// 4. Promise.race(竞速:第一个完成的结果)
const requestWithTimeout = (fn, timeout) => {
  return Promise.race([
    fn(),
    new Promise((_, reject) => setTimeout(() => reject('超时'), timeout))
  ]);
};

9. 其他高频语法

表格

语法

核心用法

实战场景

Set/Map

Set:去重数组;Map:键值对(键可任意类型)

数组去重、缓存数据

for...of

遍历可迭代对象(数组 / Set/Map),支持 break

/continue

替代 forEach(需中断遍历)

Object.assign

合并对象(浅拷贝)

对象合并、默认配置覆盖

Array.includes

判断数组是否包含某值(替代 indexOf)

权限判断、标签存在性检查

可选链?.

安全访问嵌套属性(ES2020,归为 ES6 生态)

user?.address?.city

空值合并??

仅当值为 null/undefined 时返回默认值(ES2020)

value ?? '默认值'

二、ES6 实战技巧(Vue3+TS 开发必用)

1. 简化状态管理(Pinia/Vuex)

javascript

运行

// 解构 + 扩展运算符简化状态更新
const useUserStore = defineStore('user', {
  state: () => ({ name: '', age: 0 }),
  actions: {
    updateUser(newData) {
      // 扩展运算符合并新数据(避免逐个赋值)
      this.$state = { ...this.$state, ...newData };
    }
  }
});

2. 组件 Props 解构

vue

<script setup lang="ts">
import { defineProps } from 'vue';
// 解构 + 默认值简化 Props 处理
const props = defineProps({
  name: { type: String, default: '未知' },
  age: { type: Number, default: 18 }
});
const { name, age } = props;
</script>

3. 异步请求封装(Promise + class)

javascript

运行

class Api {
  // 通用请求方法
  async request(url, options = {}) {
    const defaultOptions = { method: 'GET', headers: { 'Content-Type': 'application/json' } };
    const finalOptions = { ...defaultOptions, ...options };
    const res = await fetch(url, finalOptions);
    const data = await res.json();
    if (!res.ok) throw new Error(data.msg);
    return data;
  }
  // 业务方法
  getCustomer(id) {
    return this.request(`/api/customer/${id}`);
  }
}

4. 数组处理优化

javascript

运行

// 去重 + 筛选 + 映射(链式操作)
const data = [1,2,2,3,4,5];
const result = [...new Set(data)] // 去重
  .filter(item => item > 2) // 筛选
  .map(item => item * 2); // 映射
// result: [6,8,10]

// for...of 替代 forEach(支持中断)
for (const item of data) {
  if (item > 3) break;
  console.log(item);
}

5. 模块化最佳实践

javascript

运行

// 1. 按功能拆分模块(避免大文件)
// src/utils/index.ts(入口)
export * from './date'; // 导出所有日期工具
export * from './validator'; // 导出所有验证工具
export { default as request } from './request'; // 导出默认值

// 2. 按需导入(减少包体积)
import { formatDate } from '@/utils'; // 只导入需要的函数

三、避坑指南(高频错误)

  1. 箭头函数 this 指向错误:对象方法、原型方法不能用箭头函数,否则 this 指向 window/undefined;
  2. const 不是 “常量”:引用类型(对象 / 数组)内部属性可修改,仅引用不可改;
  3. 解构赋值默认值生效条件:仅当属性为 undefined 时生效(null/''/0 不生效);
  4. 扩展运算符浅拷贝:仅拷贝第一层,嵌套对象仍共享引用;
  5. Promise 未捕获错误:未加 catch 的 Promise 错误会导致控制台报错,需全局捕获;
  6. 模块化导入路径错误:相对路径 / 绝对路径区分,Vite 中 @ 指向 src 需配置。

四、总结

核心要点回顾

  1. 变量 / 解构 / 模板字符串:简化基础数据操作,是日常开发的 “语法糖”;
  2. 箭头函数 / 扩展运算符:大幅减少代码量,Vue 组件 / 数据处理高频用;
  3. class / 模块化:工程化开发的核心,封装通用逻辑、拆分代码模块;
  4. Promise:异步编程基础,是 async/await(ES2017)的前置;
  5. 实战原则:优先用 const/let、箭头函数简化回调、模块化拆分代码、class 封装通用逻辑。

ES6 是前端从 “原生开发” 到 “工程化开发” 的分水岭,掌握以上知识点 + 技巧,能覆盖 Vue3+TS 开发 90% 以上的场景,剩余可结合 ES2020+ 语法(可选链、空值合并、BigInt 等)补充

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐