除了ES6,ES还有那些必须要懂得知识?

简介: Includes 方法用来检测数组中是否包含某个元素,返回布尔类型值。

除了ES6,ES还有那些必须要懂得知识?


EcmaScript 7 新特性


Array.prototype.includes


  • Includes 方法用来检测数组中是否包含某个元素,返回布尔类型值。


指数操作符


  • 在 ES 7 中引入指数运算符 【**】,用来实现幂运算,功能与 Math.pow 结果相同。
console.log(2 ** 3)
// 输出结果是 8


EcmaScript 8 新特性


async 和 await


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


async 函数


  • async 函数的返回值为 promise 对象。
  • promise 对象的结果由 async 函数执行的返回值决定。


await 表达式


  • await 必须写在 async 函数中
  • await 右侧的表达式一般为 promise 对象。
  • await 返回的是 promise 成功的值。
  • await 的 promise 失败了,就会抛出异常,需要通过 try...catch 捕获处理。
const p = new Promise((resolve, reject) => {
  // resolve("用户数据")
  reject("失败了")
})
async function main() {
  try {
    let result = await p
    console.log(result)
  } catch (e) {
    console.log(e)
  }
}
// 调用函数
main()


ES 8 对象方法扩展


Object.values 和 Object.entries


  • Object.values() 方法返回一个给定对象的所有可枚举属性值的数组。
  • Object.entries() 方法返回一个给定对象自身可遍历属性 [key, value] 的数组。


Object.getOwnPropertyDescriptors


  • 该方法返回指定对象所有自身属性的描述对象。


EcmaScript 9 新特性


ES 9 对象扩展


  • rest 参数与 spread 扩展运算符在 ES 6 中已经引入,不过 ES 6 中只针对于数组。


  • 在 ES 9 中为对象提供了像数组一样的 rest 参数和扩展运算符。
function connect({host, port, ...user}){
  console.log(host)
  console.log(port)
  console.log(user)
}
connect({
  host: '127.0.0.1',
  port: 3306,
  username: 'root',
  password: 'root',
  type: 'master'
})


ES 9 正则扩展 - 命名捕获分组

let str = '<a herf="http://www.baidu.com">百度</a>'
// const reg = /<a herf="(.*)">(.*)<\/a>/ 未进行正则命名分组的
const reg = /<a herf="(?<url>.*)">(?<text>.*)<\/a>/
const result = reg.exec(str)


正则扩展 - 反向断言


  • 正向断言
let str = 'JS5211314你知道么555啦啦啦'
const reg = /\d+(?=啦)/
const result = reg.exec(str)

反向断言

let str = 'JS5211314你知道么555啦啦啦'
const reg = /(?<=么)\d+/
const result = reg.exec(str)


正则扩展 - dotAll


  • dot(.):元字符,除换行符以外的任意单个字符。
let str = `
  <ul>
    <li>
      <a>肖生克的救赎</a>
      <p>上映日期:1994-09-10</p>
    </li>
    <li>
      <a>阿甘正传</a>
      <p>上映日期:1994-07-06</p>
    </li>
  </ul>
`
// 声明正则
// const reg = /<li>\s+<a>(.*?)<\/a>\s+<p>(.*?)<\/p>/
const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/gs
// 执行匹配
let result
let data = []
while(result = reg.exec(str)){
  data.push({title: result[1], time: result[2]})
}


EcmaScript 10 新特性


对象扩展方法


  • Object.fromEntries
// 二维数组
const result = Object.fromEntries([
  ['name', '小伙子'],
  ['xueke', 'Java,大数据, 前端, 云计算']
])
// Map
const m = new Map()
m.set('name', 'wdawdawd')
const result = Object.fromEntries(m)
  • Object.fromEntries 与 ES 8 的 Object.entries 互为逆运算。


字符串扩展方法


  • trim 用来清除字符串的空格。


  • trimStart:用来清除字符串左边的空格。


  • trimEnd:用来清除字符串右边的空格。


数组方法扩展


  • flat:将多维数组降低维度。
const arr = [1,2,3,4,5,[6,7]]
const arr1 = [1,2,3,4,5,[6,7,[8,9,10]]]
console.log(arr.flat()) // 将二维数组降低为一维数组
console.log(arr1.flat(2)) // 将三维数组降低为一维数组,传入的参数为深度

flatMap:将 map 返回的多维数组降低维度。

const arr = [1,2,3,4]
const reasult = arr.flatMap(item => [item * 10])
// 此时输出的结果是一维数组


Symbol 扩展


  • Symbol.prototype.description
let s = Symbol('iloveyou')
console.log(s.description)
// 此时输出的结果为 ilivoyou


EcmaScript 11 新特性


私有属性

class Person{
  // 公有属性
  name
  // 私有属性
  #age
  #weight
  constructor(name, age, weight){
    this.name = name
    this.#age = age
    this.#weight = weight
  }
  intro(){
    console.log(this.#age)
  }
}
// 实例化
const girl = new Person('小红', 18, '45kg')
// console.log(girl.#name) 此时会报错,因为私有属性只能出现在类的内部,想要访问私有属性可以通过在类的内部写一个方法来获取


Promise.allSettled

const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('商品数据 - 1')
  }, 1000)
})
const p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('商品数据 - 2')
  }, 1000)
})
// 调用 allSettled 方法
const result = Promise.allSettled([p1, p2])
console.log(result);

效果:

1.png

  • Promise.all() 方法也接受一个数组类型的 Promise 对象,只不过只有在数组中所有的 Promise 对象都返回成功才会返回成功,如果有一个为失败,则都失败。


  • 两个都成功时,返回数组中 Promise 的状态和返回值。
  • 有一个失败时,则整个状态返回失败,并且返回值是失败的 Promise 对象返回的返回值。


字符串扩展


  • String.prototype.matchAll:用来得到正则批量匹配的结果。
let str = `
  <ul>
  <li>
      <a>肖生克的救赎</a>
      <p>上映日期:1994-09-10</p>
    </li>
    <li>
      <a>阿甘正传</a>
      <p>上映日期:1994-07-06</p>
    </li>
  </ul>
`
// 声明正则
const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/gs
// 调用方法
const result = str.matchAll(reg)  // 返回一个可迭代对象
for(let v of result){
  console.log(v)
}


可选链操作符


  • (?.)
function main(config){
  // const dbHost = config && config.db && config.db.host 此句可以被下面那句替换
  const dbHost = config?.db?.host
  console.log(dbHost)
}
main({
  db: {
    host: '192.168.1.100',
    username: 'root'
  },
  cache: {
    host: '192.168.1.200',
    username: 'admin'
  }
})


动态 import


  • 使用 import() 函数可以动态导入模块。


  • 语法:
import(文件路径)


数值类型 - BigInt


  • 在普通整型的基础上最后加一个 n ,就变成了大整型。
let n = 521n
console.log(n, typeof(n))
// 521n "bigint"
  • BigInt() 可以将一个整型转换为大整型。


  • 运用场景:大数值运算。


  • 注意:


  • 大整型不可以直接和整型进行计算,必须都转换为大整型才可以。


绝对全局变量


  • globalThis:始终指向全局对象(无论是浏览器还是node.js)。
console.log(globalThis) // 浏览器始终指向 window 对象,nodejs 中始终指向 global[option]


相关文章
|
10月前
|
前端开发 安全
说说你的ES7-ES12的了解
说说你的ES7-ES12的了解
|
8月前
es_详解
es_详解
29 0
|
9月前
|
JavaScript 前端开发 索引
ES9,ES10
ES9,ES10
52 0
|
10月前
ES6 Day02
ES6 Day02
41 0
|
JavaScript 前端开发 Java
【ES6】初识
【ES6】初识
|
JSON JavaScript 前端开发
ES5和ES6的介绍
《前端基础》
338 0
|
JavaScript 前端开发 Java
ES6+
ES6+
143 0
|
JavaScript
浅谈一下ES6的提升
es6的提升 在es6之前,我们定义定义变量的时候,只能使用var关键字来定变量,这样有一个问题,var定义的变量会成为全局变量。
|
网络架构
Day20 ES6
ECMAScript 6.0
59 0
|
JavaScript 前端开发
什么是ES6?
什么是ES6?
122 0
什么是ES6?