ES6(ECMAScript 2015)基本语法全解析

ES6(ECMAScript 2015)是 JavaScript 语言的重大版本更新,引入了众多革命性的语法特性,极大提升了代码的可读性、可维护性和开发效率。本文将详细介绍 ES6 的核心语法特性。

一、let 和 const 声明

1. let 声明

let用于声明块级作用域变量,解决了var的变量提升和作用域问题:

javascript

运行

复制代码
// 块级作用域
{
  let a = 10;
  var b = 1;
}
console.log(a); // ReferenceError: a is not defined
console.log(b); // 1

// 不存在变量提升
console.log(c); // ReferenceError: Cannot access 'c' before initialization
let c = 3;

// 不可重复声明
let d = 1;
let d = 2; // SyntaxError: Identifier 'd' has already been declared

2. const 声明

const用于声明常量,具有块级作用域且声明后不可重新赋值:

javascript

运行

复制代码
const PI = 3.14159;
PI = 3; // TypeError: Assignment to constant variable

// 但对象/数组的属性可修改
const obj = { name: "ES6" };
obj.name = "ECMAScript 2015"; // 允许

// 必须立即初始化
const e; // SyntaxError: Missing initializer in const declaration

二、解构赋值

1. 对象解构

javascript

运行

复制代码
const user = { name: "张三", age: 20 };

// 基本解构
const { name, age } = user;
console.log(name); // 张三
console.log(age); // 20

// 重命名
const { name: userName, age: userAge } = user;

// 默认值
const { gender = "男" } = user;

// 嵌套解构
const person = {
  info: {
    id: 1,
    address: { city: "北京" }
  }
};
const { info: { address: { city } } } = person;

2. 数组解构

javascript

运行

复制代码
const arr = [1, 2, 3];

// 基本解构
const [a, b, c] = arr;

// 跳过元素
const [x, , z] = arr;

// 剩余参数
const [first, ...rest] = arr;

// 默认值
const [m, n = 0] = [1];

三、模板字符串

使用反引号(`)包裹,支持变量插值和多行字符串:

javascript

运行

复制代码
const name = "ES6";
const version = 2015;

// 变量插值
const str = `${name} 发布于 ${version} 年`;

// 多行字符串
const html = `
  <div>
    <p>Hello ${name}</p>
  </div>
`;

// 表达式计算
const a = 10, b = 20;
const result = `${a} + ${b} = ${a + b}`;

四、箭头函数

1. 基本语法

javascript

运行

复制代码
// 传统函数
const add = function(a, b) {
  return a + b;
};

// 箭头函数
const add = (a, b) => a + b;

// 单参数可省略括号
const double = num => num * 2;

// 多行函数体需用大括号和return
const sum = (a, b) => {
  const total = a + b;
  return total;
};

2. 特性

  • 没有自己的this,继承自外层作用域
  • 不能作为构造函数,不能使用new
  • 没有arguments对象
  • 不能使用yield关键字

五、函数参数

1. 默认参数

javascript

运行

复制代码
function greet(name = "Guest") {
  console.log(`Hello ${name}`);
}
greet(); // Hello Guest

2. 剩余参数

javascript

运行

复制代码
function sum(...args) {
  return args.reduce((total, num) => total + num, 0);
}
sum(1, 2, 3); // 6

3. 扩展运算符

javascript

运行

复制代码
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5]; // [1,2,3,4,5]

const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 }; // {a:1, b:2, c:3}

六、对象扩展

1. 属性简写

javascript

运行

复制代码
const name = "ES6";
const version = 2015;

// 属性名与变量名相同时可简写
const obj = { name, version };

2. 方法简写

javascript

运行

复制代码
const obj = {
  // 传统写法
  add: function(a, b) {
    return a + b;
  },
  // 简写
  multiply(a, b) {
    return a * b;
  },
  // 箭头函数(不推荐,this指向问题)
  double: num => num * 2
};

3. 计算属性名

javascript

运行

复制代码
const key = "name";
const obj = {
  [key]: "ES6",
  [`${key}_length`]: 3
};

七、类(Class)

1. 类的定义

javascript

运行

复制代码
class Person {
  // 构造函数
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  // 实例方法
  sayHello() {
    console.log(`Hello, I'm ${this.name}`);
  }

  // 静态方法
  static create(name, age) {
    return new Person(name, age);
  }
}

// 实例化
const person = new Person("张三", 20);
person.sayHello();

// 静态方法调用
const person2 = Person.create("李四", 25);

2. 继承

javascript

运行

复制代码
class Student extends Person {
  constructor(name, age, grade) {
    super(name, age); // 调用父类构造函数
    this.grade = grade;
  }

  study() {
    console.log(`${this.name} is studying`);
  }
}

八、模块化(Module)

1. 导出(export)

javascript

运行

复制代码
// 导出变量
export const name = "ES6";
export const version = 2015;

// 导出函数
export function add(a, b) {
  return a + b;
}

// 导出类
export class Person {}

// 默认导出
export default function() {
  console.log("default export");
}

// 批量导出
const PI = 3.14;
const double = num => num * 2;
export { PI, double };

2. 导入(import)

javascript

运行

复制代码
// 导入指定成员
import { name, add } from './module.js';

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

// 导入默认导出
import defaultFunc from './module.js';

// 导入全部
import * as module from './module.js';

// 混合导入
import defaultFunc, { name } from './module.js';

九、Promise

用于处理异步操作:

javascript

运行

复制代码
const promise = new Promise((resolve, reject) => {
  // 异步操作
  setTimeout(() => {
    const success = true;
    if (success) {
      resolve("操作成功");
    } else {
      reject("操作失败");
    }
  }, 1000);
});

// 调用
promise
  .then(result => {
    console.log(result);
  })
  .catch(error => {
    console.error(error);
  })
  .finally(() => {
    console.log("操作完成");
  });

十、迭代器和生成器

1. 生成器函数

javascript

运行

复制代码
function* generator() {
  yield 1;
  yield 2;
  yield 3;
  return 4;
}

const gen = generator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: 4, done: true }

十一、Set 和 Map 数据结构

1. Set

javascript

运行

复制代码
const set = new Set([1, 2, 3, 3]);
console.log(set); // Set {1, 2, 3}

set.add(4);
set.delete(2);
console.log(set.has(3)); // true
console.log(set.size); // 3
set.clear();

2. Map

javascript

运行

复制代码
const map = new Map();
map.set("name", "ES6");
map.set("version", 2015);

console.log(map.get("name")); // ES6
console.log(map.has("version")); // true
console.log(map.size); // 2
map.delete("version");
map.clear();

十二、其他特性

1. Array 扩展方法

javascript

运行

复制代码
// Array.from
const arrayLike = { length: 2, 0: 'a', 1: 'b' };
const arr = Array.from(arrayLike); // ['a', 'b']

// Array.of
const arr = Array.of(1, 2, 3); // [1, 2, 3]

// find和findIndex
const result = [1, 2, 3].find(item => item > 2); // 3
const index = [1, 2, 3].findIndex(item => item > 2); // 2

// includes
console.log([1, 2, 3].includes(2)); // true

2. String 扩展方法

javascript

运行

复制代码
// startsWith/endsWith/includes
const str = "hello es6";
console.log(str.startsWith("hello")); // true
console.log(str.endsWith("es6")); // true
console.log(str.includes("es")); // true

// repeat
console.log("a".repeat(3)); // "aaa"

ES6 的语法特性极大丰富了 JavaScript 的表达能力,是现代前端开发的基础。掌握这些语法,能显著提升代码质量和开发效率。

相关推荐
前端fighter44 分钟前
全栈项目:闲置二手交易系统(二)
前端·vue.js·node.js
sztian681 小时前
JavaScript---BOM对象、JS执行机制、location对象
开发语言·前端·javascript
潘小安1 小时前
【译】别再想着 Figma 了,AI 才是新的设计工具
前端·ai编程·weui
少寒1 小时前
async/await:异步编程的优雅解决方案
前端·javascript
华仔啊1 小时前
CSS的clamp()函数:一行代码让网页自适应如此简单
前端·css
wordbaby1 小时前
React 误区粉碎:useEffectEvent 是“非响应式”的,所以它不会触发重渲染?
前端·react.js
Doris8931 小时前
【JS】Web APIs BOM与正则表达式详解
前端·javascript·正则表达式