ES2021新特性体验

162 阅读2分钟

String.prototype.replaceAll()

替换字符串中所有的匹配的值,可以完全代替replace以前需要和正则搭配的方案。

 	let str = "l am a cat"
    console.log(str.replaceAll("a","-"));//l -m - c-t

数字分割符

_ : 主要功能是咋使用长度很长的数字时候方便阅读使用。使用的时候不会对数字产生任何影响

	let bigNum1 = 11223344;
    let bigNum2 = 11_22_33_44;
    console.log(bigNum1 === bigNum2);//true

逻辑赋值运算符

&&= ||= ??=

x &&= y //只有当x为真的时候才会赋值给y。

x ||= y //只有当x为假的时候才会赋值给y。如果x为真,y为假,则不会赋值。

x ?? = y //只有x=null或x=undefined的时候才会将y赋值给x。

	let x = true;
    let y = "yy";
    x &&= y
    console.log(x);//yy

    let x = 0;
    let y = "yy";
    x ||= y
    console.log(x);//yy

    let x = null;
    let y = "yy";
    x ??= y
    console.log(x);//yy

Promise.any()

这个方法接受多个promise,只要有一个resolve就返回。返回值是resolve的第一个Promise。

如果所有的Promise均被拒绝,返回Error,并且报错原因。

  • 全部resolved

  • let promise1 = new Promise((resolve,reject)=>{
          setTimeout(()=>{
            resolve("p1 is resolved");
          },100)
        })
        let promise2 = new Promise((resolve,reject)=>{
          setTimeout(()=>{
            resolve("p2 is resolved");
          },50)
        })
        ;(
          async function(){
            let res = await Promise.any([promise1,promise2])
            console.log(res);//p2 is resolved
          }
        )()
    
    • 只有一个resolved

    • let promise1 = new Promise((resolve,reject)=>{
            setTimeout(()=>{
              resolve("p1 is resolved");
            },100)
          })
          let promise2 = new Promise((resolve,reject)=>{
            setTimeout(()=>{
              reject("p2 is resolved");
            },50)
          })
          ;(
            async function(){
              let res = await Promise.any([promise1,promise2])
              console.log(res);//p2 is resolved
            }
          )()
      
      • 全部rejected

      • let promise1 = new Promise((resolve,reject)=>{
              setTimeout(()=>{
                reject("p1 is resolved");
              },100)
            })
            let promise2 = new Promise((resolve,reject)=>{
              setTimeout(()=>{
                reject("p2 is resolved");
              },50)
            })
            ;(
              async function(){
                let res = await Promise.any([promise1,promise2])
                console.log(res);// All promises were rejected
              }
            )()
        

        弱引用 : WeakRef

        在JavaScript中,当你创建了一个对象时候,指向这个对象的引用在js中永远无法被垃圾回收,只要这个引用存在,这个对象就一直存在。

        可以通过创建对象的弱引用,在跟踪对象的时候不会进行垃圾回收。有助于减少缓存。

        使用new关键字创建新的weakRef,并把对象作为参数传入括号中,读取的时候需要通过deref()使用。

        const myWeakRef = new WeakRef({
              name:'refName',
              size:'10000'
            })
            console.log(myWeakRef.deref().name);//refName
            console.log(myWeakRef.deref().size);//10000
           
        

        Finalizers 和 FinalizationRegistry

        创建一个回调函数,在被回收的时候调用

        const reg = new FinalizationRegistry((val) => {
          console.log(val)
        })
        ;(() => {
          // 创建新对象:
          const obj = {}
          reg.register(obj, 'obj has been garbage-collected.')
        })()
        

        tips:尽量不要使用weakRef和finalizer,因为还不是非常稳定,可能会造成错误。