记录高级js学习(十五)ES7-12

95 阅读4分钟
ES7

includes和平方运算符

      // 判断数组内是否存在某元素的方法includes()
      const Arr = [1,2,3,4,5,NaN]
      // ES7之前
      console.log(Arr.indexOf(2)); //存在返回索引值,不存在返回-1
      // ES7
      console.log(Arr.includes(2)); //存在返回真
      console.log(Arr.includes(2,3)); //第二个参数为从第几个索引值开始判断

      // 区别
      console.log(Arr.indexOf(NaN));  //无法判断NaN
      console.log(Arr.includes(NaN)); //true

      // 平方运算符
      // ES7之前
      const num1 = Math.pow(3,3)  //3的三次方 9
      console.log('num1: ', num1);
      // ES7
      const num2 = 3 ** 3  
      console.log('num2: ', num2);
ES8

1.Object.value() 获取对象所有的值组成的数组

2.Object.entries() 将对象转换为entries类型[[key,value],[key,value]],用于new Map()

3.padStart() padEnd() 参数:(总长度,补全字符串),第二个参数不填默认填充空格,可用于时间前补充0

      // 应用场景,获得规范时间
      const date = new Date()
      const hh = String(date.getHours()).padStart(2,0)
      const mm = String(date.getMinutes()).padStart(2,0)
      const ss = String(date.getSeconds()).padStart(2,0)
      console.log(`${hh}:${mm}:${ss}`);

4.async,await:后面再写一篇文章单独讲

ES9

Promise:后面再写一篇文章单独讲

ES10

1.flat(deep=1)数组降维,维度默认为1层 设置为Infinity扁平化最深一层

2.flatMap(item=>{ })数组映射且降低1维度 flatMap 方法等效于 array.map().flat()

      // flat数组降维,参数为维度,默认为1
      const arr = [1,2,3,[4,5],6,7,[[8,9],12,1,3,5,6,7]] 
      const newArr = arr.flat(Infinity)
      console.log('newArr: ', newArr);
      // flatMap数组映射且降维1层
      const strArr = ["Hello World","hello fmy","HELLO zs"]
      const newStrArr = strArr.flatMap(item=>{
        return item.split(" ")
      })
      console.log('newStrArr: ', newStrArr);

3.Object.fromEntries() 把enteris转为对象

      // enteris转对象,Map类型也能用,应用场景,拿URL参数
      const url = "name=李斯&age=22"
      const urlParmes = new URLSearchParams(url) //这个方法返回的是类似Map类型的映射关系,也可用fromEnteris
      console.log('urlParmes: ', urlParmes);
      const objParmes = Object.fromEntries(urlParmes)
      console.log('objParmes: ', objParmes);  //{name:"李斯",age:22}

4.trim trimStart trimEnd 去字符串首尾空格 5.try{} catch{} 捕获异常

ES11

1.BigInt大整数类型,末尾加n,最大值9007199254740991

      const maxInt = Number.MAX_SAFE_INTEGER  //获取最大数字
      console.log('maxInt: ', maxInt);  //最大的数字 超过了不安全 计算不一定准确 9007199254740991
      console.log('maxInt+1: ', maxInt+1); // 9007199254740992
      console.log('maxInt+2: ', maxInt+2); // 9007199254740992  出错了
      
      const bigInt = 9007199254740991n   //加个n代表大数字
      console.log(bigInt + 2n);  //这个时候就正确了 9007199254740993  同为大数字类型才能操作 不然会报错
      console.log(bigInt + BigInt(2)); // 9007199254740993 这种也可以
      console.log(Number(bigInt))   //大数字类型转为普通类型
  1. ??空值合并运算符 用来取代||误判0和“”为false的情况
      console.log(undefined || "空值"); //空值
      console.log(null || "空值"); //空值
      console.log("" || "空值"); //空值  这两个被误认为空值了 所以是错误的
      console.log(0 || "空值"); //空值  

      console.log("" ?? "空值"); //""  因此引入了空值合并运算符
      console.log(0 ?? "空值"); //0   只有null和undefined为false
  1. ?.可选链,判断对象是否有该属性,没有就不继续查找直接返回undefined
      // 可选链?.  知道就好 不要乱用 不报错更难找bug,甩锅后端
      const obj = {
        name:"李斯",
        address:{}
      }
      //这样会先判断address是否存在 存在则继续找下层,不存在则结束查找直接返回undefined,不会报错影响后面代码执行
      console.log(obj.address?.area?.name);  //undefined
      console.log(obj.address.area.name); //报错
      console.log("剩余执行代码");  //上行代码报错导致后续代码不执行

4.globalThis 获取当前环境的全局对象 浏览器为window,node环境为global

ES12

1.FinalizationRegistry监听某个对象内存被回收执行回调

      // FinalizationRegistry类监听一个对象回收,执行回调
      const finalRegistry = new FinalizationRegistry(val=>{
        console.log(val,"已回收");
      })
      let obj = {}
      finalRegistry.register(obj,"obj对象")  //监听的对象以及回调接收的val值
      obj = null

2.WeakRef创建一个弱引用对象

      // WeakRef创建一个弱引用,需要使用deref()才能获取属性
      const finalRegistry = new FinalizationRegistry(val=>{
        console.log(val,"已回收");
        console.log(newObj.deref()?.name); //undefined 证明回收成功
      })
      let obj = {name:"李斯"}
      const newObj = new WeakRef(obj)
      // 不能直接打印整个obj 否则obj不会被GC回收,造成内存泄漏
      // console.log('newObj: ', newObj.deref());  
      console.log(newObj.deref().name);
      finalRegistry.register(obj,"obj")
      obj = null

3.逻辑赋值运算符,与上面空值合并运算符类似,管道符会把0和""当做false

      // 逻辑赋值运算||= &&= ??=
      let stra = undefined
      let straa = 0
      stra ||= "值为undefined"
      console.log('stra: ', stra);  //值为undefined
      straa ||= "值为undefined"
      console.log('straa: ', straa);  //值为undefined
      let strb = undefined
      let strbb = 0
      strb ??= "值为undefined"
      console.log('strb: ', strb);  //值为undefined
      strbb ??= "值为undefined"
      console.log('strbb: ', strbb);  //0