ES6/ES7/ES8/ES9 常用 API 汇总及实例

随着前端技术的不断发展,JavaScript 也在不断地更新和完善。ES6/ES7/ES8/ES9 是 JavaScript 的四个重要版本,其中包含了很多新的语法和 API,为我们的开发工作带来了很大的便利。本文将为大家汇总 ES6/ES7/ES8/ES9 中常用的 API,并通过实例来进行讲解,以便于大家更好地掌握这些新特性。

ES6 常用 API

let 和 const

ES6 中新增了两个关键字 let 和 const,用于声明变量和常量。let 声明的变量只在块级作用域内有效,而 const 声明的常量则不能被重新赋值。这样可以有效避免变量污染和意外修改常量的情况。

// let 示例
function test() {
  let a = 1;
  if (true) {
    let a = 2;
    console.log(a); // 2
  }
  console.log(a); // 1
}

// const 示例
const PI = 3.1415926;
PI = 3; // TypeError: Assignment to constant variable.

箭头函数

ES6 中引入了箭头函数,可以简化函数的书写。箭头函数不需要 function 关键字,而且可以省略 return 关键字。同时,箭头函数的 this 指向是固定的,不会因为执行环境的改变而改变。

// 普通函数和箭头函数的对比
function add(a, b) {
  return a + b;
}

let add = (a, b) => a + b;

// this 指向问题的对比
let obj = {
  count: 0,
  add: function() {
    setInterval(function() {
      this.count++;
      console.log(this.count);
    }, 1000);
  }
};

let obj = {
  count: 0,
  add: function() {
    setInterval(() => {
      this.count++;
      console.log(this.count);
    }, 1000);
  }
};

模板字符串

ES6 中新增了模板字符串,可以方便地进行字符串的拼接和换行。模板字符串使用反引号(`)包裹,其中可以使用 ${} 来引用变量或表达式。

// 普通字符串和模板字符串的对比
let name = 'Tom';
let str1 = 'Hello, ' + name + '!';
let str2 = `Hello, ${name}!`;

// 换行示例
let str3 = `Hello,
${name}!`;

解构赋值

ES6 中引入了解构赋值,可以方便地从数组或对象中提取数据并赋值给变量。解构赋值可以减少代码量,提高可读性。

// 数组解构赋值
let arr = [1, 2, 3];
let [a, b, c] = arr;

// 对象解构赋值
let obj = { name: 'Tom', age: 18 };
let { name, age } = obj;

Set 和 Map

ES6 中新增了 Set 和 Map 两种集合类型。Set 是一种无序不重复元素的集合,可以用来去重。Map 是一种键值对的集合,可以快速查找某个键对应的值。

// Set 示例
let set = new Set([1, 2, 3, 3]);
console.log(set); // Set {1, 2, 3}

// Map 示例
let map = new Map();
map.set('name', 'Tom');
map.set('age', 18);
console.log(map.get('name')); // Tom

ES7 常用 API

Array.prototype.includes

ES7 中新增了 Array.prototype.includes 方法,用于判断一个数组是否包含某个元素。这个方法比 indexOf 更加直观和方便。

let arr = [1, 2, 3];
console.log(arr.includes(2)); // true
console.log(arr.includes(4)); // false

指数运算符

ES7 中新增了指数运算符 **,可以用来计算幂次方。这个运算符比 Math.pow 更加直观和方便。

console.log(2 ** 3); // 8
console.log(2 ** 4); // 16

ES8 常用 API

async/await

ES8 中引入了 async/await,用于简化异步操作的代码。async/await 是基于 Promise 的,可以让我们使用同步的方式来处理异步操作。

// Promise 示例
function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('Data');
    }, 1000);
  });
}

fetchData().then(data => console.log(data));

// async/await 示例
async function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve('Data');
    }, 1000);
  });
}

async function test() {
  let data = await fetchData();
  console.log(data);
}

test();

Object.values 和 Object.entries

ES8 中新增了 Object.values 和 Object.entries 方法,用于获取对象的值和键值对数组。这两个方法可以方便地遍历对象的属性。

let obj = { name: 'Tom', age: 18 };

console.log(Object.values(obj)); // ['Tom', 18]
console.log(Object.entries(obj)); // [['name', 'Tom'], ['age', 18]]

ES9 常用 API

Promise.prototype.finally

ES9 中新增了 Promise.prototype.finally 方法,用于在 Promise 状态改变后执行一些操作。这个方法和 then 不同,即使 Promise 被拒绝或者成功,finally 都会执行。

fetch('https://jsonplaceholder.typicode.com/todos/1')
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error(error))
  .finally(() => console.log('Fetch completed.'));

Rest/Spread 属性

ES9 中引入了 Rest/Spread 属性,可以用于简化对象和数组的操作。Rest 属性可以将对象或数组的剩余属性合并成一个新的对象或数组。Spread 属性可以将对象或数组展开成单独的属性。

// Rest 属性示例
let obj = { name: 'Tom', age: 18, gender: 'male' };
let { name, ...rest } = obj;
console.log(rest); // { age: 18, gender: 'male' }

let arr = [1, 2, 3, 4, 5];
let [a, b, ...rest] = arr;
console.log(rest); // [3, 4, 5]

// Spread 属性示例
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let arr3 = [...arr1, ...arr2];
console.log(arr3); // [1, 2, 3, 4, 5, 6]

let obj1 = { name: 'Tom' };
let obj2 = { age: 18 };
let obj3 = { ...obj1, ...obj2 };
console.log(obj3); // { name: 'Tom', age: 18 }

总结

ES6/ES7/ES8/ES9 中新增了很多新的语法和 API,为我们的开发工作带来了很大的便利。本文介绍了其中一些常用的 API,并通过实例来进行讲解。希望本文对大家学习和使用这些新特性有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65bd8261add4f0e0ff736474