ES7新特性

  1. // includes indexOf 查看数组元素 是否存在
  2. const arr = ['test1', 'test2', 'test3'];
  3. //判断
  4. console.log(arr.includes('test2'));
  5. console.log(arr.includes('test'));
  1. //2. ** 计算次方 相当于 Math.pow()方法
  2. console.log(2 ** 10); // 2 的10次方
  3. console.log(Math.pow(2,10));

ES8 async 和 await 函数

async 和 await 两种语法结合可以让异步代码像同步代码一样

async函数

  1. async 函数的返回值是 promise 对象
  2. promise 对象的结果由 async 函数执行返回值决定
  1. //实例 async 函数
  2. async function fn () {
  3. //情况1.
  4. // 返回一个字符串
  5. // return 'test'; // 返回结果为 Promise 对象
  6. // 只要 返回的结果 不是 Promise 对象, 则返回的结果就是一个成功的 Promise 对象
  7. // return;
  8. //2. 情况2
  9. // 抛出错误, 返回的结果是一个失败的 Promise
  10. // throw new Error('出错了');
  11. //3. 情况3
  12. // 如果返回结果是一个Promise对象
  13. return new Promise((resolve, reject) => {
  14. resolve('成功获取数据'); // 如果成功,返回成功的Promise
  15. // reject('获取数据失败'); // 如果失败,返回失败的Promise
  16. })
  17. }
  18. const result = fn(); // Promise {<fulfilled>: 'test'}
  19. // Promise {<rejected>: Error: 出错了
  20. // 如果成功,返回成功的Promise , 如果失败,返回失败的Promise
  21. // console.log(result);
  22. // 使用 then 方法 回调 , 基本和使用 Promise 一样
  23. result.then(value => {
  24. console.log(value)
  25. }, reason => {
  26. console.warn(reason)
  27. })

await 表达式

  1. await 必须写在async 中
  2. await 右侧的表达式一般为 promise 对象
  3. await 返回的是 promise 成功的值
  4. await 的 promise 失败了,就会抛出异常, 需用通过 try…catch 捕获处理

// 创建 Promise 对象
const p = new Promise((resolve, reject) => {
// resolve(‘成功获取数据’); // 成功时候
reject(‘失败的调用’);
})

  1. // await 要放在 async 函数中
  2. async function main () {
  3. // await 右侧的表达式一般为 promise 对象
  4. // 成功获取时
  5. // let result = await p;
  6. // console.log(result); // 返回成功的数据
  7. // 获取失败时
  8. try {
  9. let result = await p;
  10. }catch (e) {
  11. console.log(e);
  12. }
  13. }
  14. main();

async和await结合读取数据

  1. const fs = require('fs');
  2. // fs 读取文件 是一个 异步调用方法
  3. function readFile1() {
  4. // 此函数返回值 是一个 Promise 对象
  5. return new Promise((resolve, reject) => {
  6. fs.readFile('./result/test.md', (err, data) => {
  7. // 如果失败
  8. if (err) reject(err);
  9. resolve(data);
  10. })
  11. })
  12. }
  13. function readFile2() {
  14. // 此函数返回值 是一个 Promise 对象
  15. return new Promise((resolve, reject) => {
  16. fs.readFile('./result/test2.md', (err, data) => {
  17. // 如果失败
  18. if (err) reject(err);
  19. resolve(data);
  20. })
  21. })
  22. }
  23. function readFile3() {
  24. // 此函数返回值 是一个 Promise 对象
  25. return new Promise((resolve, reject) => {
  26. fs.readFile('./result/test3.md', (err, data) => {
  27. // 如果失败
  28. if (err) reject(err);
  29. resolve(data);
  30. })
  31. })
  32. }
  33. // 声明一个 async 函数
  34. async function main () {
  35. // 读取内容
  36. // let test = readFile1(); // 异步情况, 如果没有使用await,则返回 [object Promise]
  37. let test = await readFile1();
  38. let test2 = await readFile2();
  39. let test3 = await readFile3();
  40. console.log(test.toString());
  41. console.log(test2.toString());
  42. console.log(test3.toString());
  43. }
  44. main();

async和await结合发送Ajax请求

  1. // 发送请求, 返回结果是 Promise 对象
  2. function sendAjax(url) {
  3. // 在这里就 返回 Promise 对象
  4. return new Promise((resolve, reject) => {
  5. // Ajax发送请求
  6. const x = new XMLHttpRequest();
  7. x.open('GET', url);
  8. x.send();
  9. x.onreadystatechange = function () {
  10. if (x.readyState === 4) {
  11. if (x.status >= 200 && x.status < 300) {
  12. resolve(x.response); // 成功
  13. }else {
  14. reject(x.status); // 失败
  15. }
  16. }
  17. }
  18. })
  19. }
  20. //测试1. 使用 Promise 的then 方法 测试
  21. // sendAjax('https://autumnfish.cn/api/joke').then(value => {
  22. // console.log(value)
  23. // }, reason => {
  24. // console.log(reason);
  25. // })
  26. //测试2. 使用 async 和 await 方法
  27. async function main () {
  28. const result = await sendAjax('https://autumnfish.cn/api/joke')
  29. const xiaohua = await sendAjax('https://autumnfish.cn/api/joke/list?num=2');
  30. console.log(result);
  31. console.log(xiaohua);
  32. }
  33. main();

ES8 对象方法的扩展

  1. // 声明对象
  2. const school = {
  3. name: 'Yellowsea',
  4. className: ['test', 'test2','test3'],
  5. techers: ['1','2','3'],
  6. }
  7. //对象的扩展方法
  8. //1. Object.keys() 获取所有的键
  9. console.log(Object.keys(school));
  10. //2. Object.values() 获取所有的值
  11. console.log(Object.values(school));
  12. //3. Object.entries() 获取所有的键值对 , 返回一个数组, 数组元素为 键值对 的数组
  13. console.log(Object.entries(school)); // [Array(2), Array(2), Array(2)]
  14. // 方便使用 Map() 方法
  15. const m = new Map(Object.entries(school));
  16. console.log(m);
  17. console.log(m.get('className'));
  18. //4. Object.getOwnPropertyDescriptors()
  19. // 对象属性的描述对象
  20. console.log(Object.getOwnPropertyDescriptors(school));
  21. // 就是对象属性的配置 (创建对象的底层)
  22. const obj = Object.create(null, {
  23. // 这里写的就是对象属性的描述
  24. name : {
  25. value: 'Yellowsea',
  26. // 可写 可修改删除 可枚举
  27. writable: true,
  28. configurable: true,
  29. enumerable: true
  30. }
  31. })
  32. console.log(obj); // {name: 'Yellowsea'}

ES9对象展开-扩展运算符

Rest 参数 spread 扩展运算符 在 ES6 中已经引入, 不过ES6 中只针对数组

在ES9 中为对象提供了像数组一样的rest 参数 和 扩展运算符

实例

  1. function connect({host, port, ...username}) { // ...username 对 username 后面的数据进行压缩到一个数组
  2. // 输出
  3. console.log(host, port,username);
  4. // localhost 3306 {username: 'test', password: 'test'}
  5. }
  6. connect({
  7. host: 'localhost',
  8. port: 3306,
  9. username: 'test',
  10. password: 'test',
  11. type: 'utf-8',
  12. })
  13. //2. 对象合并 ...
  14. let obj1= {name1: 'obj1',}
  15. let obj2= {name2: 'obj2'}
  16. let obj3= {name3: 'obj3'}
  17. // 对象合并
  18. // ...obj 展开 对象中的数据
  19. const result = {...obj1,...obj2,...obj3}
  20. console.log(result)

ES10

对象扩展方法Object.fromEntries

  1. // 二维数组
  2. // Object.fromEntries() 接收一个二维数组 , 将二维数组 转为 键|值形式
  3. const result = Object.fromEntries([
  4. ['name', 'yellowsea'],
  5. ['test', 'test,test,test']
  6. ])
  7. console.log(result);
  8. // {name: 'yellowsea', test: 'test,test,test'}
  9. // Map
  10. const m = new Map(); // 新的数据结构, 可以通过 Map属性, 对Map进行操作
  11. m.set('name', 'Yellowsea'); // 添加属性
  12. const res = Object.fromEntries(m);
  13. console.log(res, typeof res); // {name: 'Yellowsea'} object
  14. // Object.fromEntries() 方法 将数组转为一个对象
  15. // ES8 中 Object.Entries 方法将 对象 转为 数组(二维数组) // 相反的关系
  16. const obj2 = {
  17. name: 'yellowsea',
  18. test: 'test'
  19. }
  20. const res2 = Object.entries(obj2);
  21. console.log(res2); // [Array(2), Array(2)]
  22. const res3 = Object.fromEntries(res2);
  23. console.log(res3); // {name: 'yellowsea', test: 'test'}

ES10字符串方法trimStart和trimEnd方法

  1. // 之前就有 trim 方法 去除字符串两边的空格
  2. const str = ' hello ';
  3. console.log(str.trim()); // hello
  4. // trimStart() 去除字符串 前边的空格
  5. console.log(str.trimStart());
  6. // trimEnd() 去除字符串 后面的空格
  7. console.log(str.trimEnd());

数组方法flat和flatMap

  1. // ES10数组方法flat和flatMap
  2. const arr = [1,2,3, [4,5, [6,7,8]]];
  3. // flat()
  4. // 作用 : 将多维数组转为 低维数组
  5. console.log(arr.flat()); // [1, 2, 3, 4, 5] -> 二维数组转为一维数组
  6. //将三维数组 转为1维数组 , 需要 flat(参数) 参数为 数组的深度 默认为1
  7. console.log(arr.flat(2)); // [1, 2, 3, 4, 5, 6, 7, 8]
  8. // flatMap()
  9. // 也是将多维数组转为低维数组
  10. //用法 : 在使用Map进行循环运算时 计算过程中返回具有二维数组, 使用 flatMap() 可以对数组降维
  11. const arr2 = [1,2,3,4];
  12. //使用 map() 循环时 , 没有使用 flatMap()
  13. const result1 = arr2.map(item => [item * 10] );
  14. console.log(result1); // [[10], [20], [30], [40]]
  15. // 使用 flatMap() 对数组降维
  16. const result2 = arr2.flatMap(item => [item * 10]) // 能够降维
  17. console.log(result2); // [10, 20, 30, 40]

Symbol.prototype.description直接获取Symbol属性值

  1. // Symbol.prototype.description直接获取Symbol属性值
  2. const s = Symbol('这是Symbol属性')
  3. console.log(s.description); // 这是Symbol属性

ES11

Class类私有属性

  1. // 私有属性
  2. class Person {
  3. //共有属性
  4. name;
  5. // 私有属性
  6. #age; // 使用 #变量 定义私有属性
  7. #weight;
  8. constructor(name, age, weight) {
  9. this.name = name;
  10. this.#age = age; // 初始化时候 也是 使用 #age
  11. this.#weight = weight;
  12. }
  13. // 内部方法
  14. intro() {
  15. console.log(this.name);
  16. console.log(girl.#age)
  17. console.log(girl.#weight)
  18. }
  19. }
  20. // 对象 实例化
  21. const girl = new Person('小红', 12, '12kg');
  22. // console.log(girl.name) // 查看属性
  23. // console.log(girl.#age) // 报错, 无法通过实例化对象查看 私有属性
  24. // console.log(girl.#weight
  25. girl.intro(); // 可以成功访问

Promise.allSettled方法

Promise.allSettled(), 参数接收一个数组, 数组中元素必须是一个 Promise 对象

Promise.allSettled() 返回数据也是一个Promise对象, 返回值始终是一个成功的Promise,值数组中Promise的返回值

  1. // 声明两个 Promise 对象
  2. const p1 = new Promise((resolve, reject) => {
  3. setTimeout(()=> {
  4. resolve('p1成功');
  5. }, 1000)
  6. })
  7. const p2 = new Promise((resolve, reject) => {
  8. setTimeout(()=> {
  9. // resolve('p2成功');
  10. reject('p2失败')
  11. }, 1000)
  12. })
  13. // 调用 allSettled 方法
  14. const result = Promise.allSettled([p1,p2]); // 传入的参数必须是 数组
  15. console.log(result);
  16. // 跟 allSettled 方法相似的 all() 方法
  17. // all() 方法 接收也是一个数组,
  18. // 区别是:数组Promise元素,如果有一个出错,返回结果返回就是 失败的状态 。 必须是Promise的状态全部成功,才返回成功
  19. const showResult = Promise.all([p1,p2]);
  20. console.log(showResult);

对象可选链操作符

?. 对象的可选链操作符

  1. // ?.
  2. // 用于判断对象是否存在,如果存在,则执行, 不存在 返回 undefined
  3. function main(config) {
  4. // 获取 config.db.host
  5. // 先判断config是否为空 再判断 config.db 是否为空 再进行config.db.host的赋值
  6. // const dbHost = config && config.db && config.db.host // 这样子判断太麻烦了,
  7. // 使用可选链, ?. 如果有执行后面, 如果没有 返回 undefined
  8. const dbHost = config?.db?.host
  9. console.log(dbHost); // 1.2.3.4
  10. }
  11. main({
  12. db: {
  13. host: '1.2.3.4',
  14. username: 'root'
  15. },
  16. cache: {
  17. host: '192.1.4.1',
  18. username: 'admin',
  19. }
  20. })

新数字类型BigInt

  1. // 大整形 BigInt
  2. let n = 123n;
  3. console.log(n, typeof n); // 123n 'bigint'
  4. // 使用 BigInt 将 一个整形的数字转为 BigInt 类型
  5. // BigInt() 只能接收 整形, 不能接收 Float 类型
  6. let n1 = 123;
  7. console.log(BigInt(n1)); // 123n
  8. // BigInt 类型数, 运算
  9. let max = Number.MAX_SAFE_INTEGER;
  10. console.log(max);
  11. console.log(max + 1)
  12. console.log(max + 2)
  13. console.log(max + 3)
  14. // BigInt运算
  15. console.log(BigInt(max) + BigInt(1)); // 9007199254740992n
  16. console.log(BigInt(max) + BigInt(max)); // 8014398509481982n

绝对全局对象globalThis

  1. // 绝对全局对象globalThis
  2. console.log(globalThis);
  3. // 使用浏览器时, 返回的全局对象是 window
  4. // 使用 node 环境时 , 返回的全局对象就是 global