返回

ES6 之后 JavaScript 使用笔记

前端

ES6 的历史包袱

JavaScript 是一门历史悠久的语言,它最早诞生于 1995 年。自那以后,JavaScript 经历了多次版本迭代,其中最重大的版本更新莫过于 ES6(又称 ECMAScript 2015)。ES6 于 2015 年 6 月正式发布,它为 JavaScript 带来了许多新的特性和改进,极大地提升了 JavaScript 的开发效率和灵活性。

然而,ES6 的发布也给 JavaScript 带来了一个新的问题——历史包袱。由于 JavaScript 是运行在浏览器中的,因此它不能完全脱离浏览器的历史包袱。这意味着一些不合理的特性和语法不能在 JavaScript 中轻易移除,否则将会导致大量旧有代码失效。

ES6 的新特性

尽管 ES6 带来了历史包袱,但它也为 JavaScript 带来了许多新的特性和改进。这些新特性极大地提升了 JavaScript 的开发效率和灵活性,使其能够构建更复杂的应用程序。

箭头函数

箭头函数是 ES6 中引入的一种新的函数语法。箭头函数的语法更简洁,而且它可以自动绑定 this 指向,这使得它非常适合用于事件处理和回调函数。

// ES5 函数
function add(x, y) {
  return x + y;
}

// ES6 箭头函数
const add = (x, y) => x + y;

模板字符串

模板字符串是 ES6 中引入的一种新的字符串语法。模板字符串使用反引号(`)来包裹字符串,并且允许在字符串中嵌入变量和表达式。

// ES5 字符串拼接
const name = "John";
const greeting = "Hello, " + name + "!";

// ES6 模板字符串
const name = "John";
const greeting = `Hello, ${name}!`;

解构赋值

解构赋值是 ES6 中引入的一种新的赋值语法。解构赋值可以将对象或数组的属性或元素直接赋值给变量。

// ES5 对象解构
const person = {
  name: "John",
  age: 30
};

const name = person.name;
const age = person.age;

// ES6 对象解构
const person = {
  name: "John",
  age: 30
};

const { name, age } = person;

扩展运算符

扩展运算符是 ES6 中引入的一种新的运算符。扩展运算符可以将数组或对象展开为一系列的元素或属性。

// ES5 数组展开
const numbers = [1, 2, 3, 4, 5];

const newNumbers = [...numbers, 6, 7, 8, 9, 10];

// ES6 对象展开
const person = {
  name: "John",
  age: 30
};

const newPerson = {
  ...person,
  job: "developer"
};

默认参数

默认参数是 ES6 中引入的一种新的参数语法。默认参数允许函数在没有提供参数值的情况下使用默认值。

// ES5 默认参数
function greet(name) {
  name = name || "John";

  return "Hello, " + name + "!";
}

// ES6 默认参数
function greet(name = "John") {
  return "Hello, " + name + "!";
}

块级作用域

块级作用域是 ES6 中引入的一种新的作用域类型。块级作用域允许在代码块内部定义的变量只在该代码块内部有效。

// ES5 作用域
function foo() {
  var x = 1;

  {
    var x = 2;

    console.log(x); // 2
  }

  console.log(x); // 1
}

// ES6 作用域
function foo() {
  let x = 1;

  {
    let x = 2;

    console.log(x); // 2
  }

  console.log(x); // 1
}

let 和 const

let 和 const 是 ES6 中引入的两种新的变量声明。let 声明的变量是块级作用域的,而 const 声明的变量是常量,不能重新赋值。

// ES5 变量声明
var x = 1;

// ES6 变量声明
let x = 1;
const y = 2;

class

class 是 ES6 中引入的一种新的语法,它允许创建类。类是面向对象编程的基础,它允许将数据和行为封装在一起。

// ES5 类
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// ES6 类
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}

模块

模块是 ES6 中引入的一种新的语法,它允许将代码组织成不同的模块。模块可以单独编译和加载,这使得代码更容易维护和复用。

// ES5 模块
var module = (function() {
  // 模块代码
})();

// ES6 模块
export function add(x, y) {
  return x + y;
}

import { add } from "./module.js";

Promise

Promise 是 ES6 中引入的一种新的对象,它表示一个异步操作的结果。Promise 可以用来处理异步操作,并可以将异步操作的结果传递给其他函数。

// ES5 异步操作
function getData(callback) {
  setTimeout(function() {
    callback({
      name: "John",
      age: 30
    });
  }, 1000);
}

getData(function(data) {
  console.log(data);
});

// ES6 Promise
function getData() {
  return new Promise((resolve, reject) => {
    setTimeout(function() {
      resolve({
        name: "John",
        age: 30
      });
    }, 1000);
  });
}

getData().then(function(data) {
  console.log(data);
});

异步/等待

异步/等待是 ES6 中引入的一种新的语法,它允许使用同步的语法来处理异步操作。异步/等待语法可以简化异步操作的处理,并使代码更易于阅读和理解。

// ES5 异步/等待
function getData() {
  return new Promise((resolve, reject) => {
    setTimeout(function() {
      resolve({
        name: "John",
        age: 30
      });
    }, 1000);
  });
}

getData().then(function(data) {
  console.log(data);
});

// ES6 异步/等待
async function getData() {
  const data = await new Promise((resolve, reject) => {
    setTimeout(function() {
      resolve({
        name: "John",
        age: 30
      });
    }, 1000);
  });

  console.log(data);
}

getData();

迭代器

迭代器是 ES6 中引入的一种新的对象,它允许遍历数据结构。迭代器可以用来遍历数组、对象和字符串等数据结构。

// ES5 迭代器
var numbers = [1, 2, 3, 4, 5];

for (var i = 0; i < numbers.length; i++) {
  console.log(numbers[i]);
}

// ES6 迭代器
const numbers = [1, 2, 3, 4, 5];

for (const number of numbers) {
  console.log(number);
}

生成器

生成器是 ES6 中引入的一种新的函数类型。生成器可以生成一个序列的值,并且可以在每次生成一个值时暂停和恢复。

// ES6 生成器
function* generateNumbers() {
  yield 1;
  yield 2;