首页 > 其他分享 >【前端】ES12:ES12新特性

【前端】ES12:ES12新特性

时间:2024-09-28 20:18:37浏览次数:7  
标签:obj like 前端 特性 let Promise new ES12 wmap

文章目录

  • 1 逻辑赋值操作符
  • 2 数字分隔符
  • 3 replaceAll
  • 4 Promise.any
  • 5 WeakRef
  • 6 FinalizationRegistry

1 逻辑赋值操作符

逻辑赋值操作符 ??=、&&=、 ||=。

let a = true
let b = false
//a &&= b //false
a ||= b ; //true
console.log(a)

let obj = {
    name:"kerwin",           
}

obj.introduction = obj.introduction ?? "很懒"
obj.introduction ??= "很懒"

2 数字分隔符

这个新特性是为了方便程序员看代码而出现的,如果数字比较大,那么看起来就不是那么一目了然。

const num = 123456789

分隔符不仅可以分割十进制,也可以分割二净值或者十六净值的数据,非常好用。

const number = 1_000_000_000_000;
const binary = 0b1010_0101_1111_1101;
const hex = 0xA1_B2_C3;

3 replaceAll

所有匹配都会被替代项替换。模式可以是字符串或正则表达式,而替换项可以是字符串或针对每次匹配执行的函数。并返回一个全新的字符串

const str = "I wish to wish the wish you wish to wish, but if you wish the wish the witch wishes, I won't wish the wish you wish to wish. ";
const newStr = str.replaceAll("wish", "kerwin");
console.log(newStr);

4 Promise.any

只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。

Promise.any()Promise.race()方法很像,只有一点不同,就是Promise.any()不会因为某个Promise变成rejected状态而结束,必须等到所有参数Promise变成rejected状态才会结束。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
       // Promise.all 都成功了就走.then,只要有一个失败了就走.catch
       // Promise.race 部署两个接口,超时处理
       // Promise.allSettled 成功失败都走.then,能显示就显示,不能显示就过滤掉,页面也能成功展示出数据
     
       // Promise.any // some
       //登录-会员联盟系统(沃尔玛,华润万家,盒马)如果三家都没有账号就走catch注册
       let ajax1 = function(){
           return new Promise((resolve,reject)=>{
                //resolve("沃尔玛")
                reject("沃尔玛")
           })
       }
       let ajax2 = function(){
           return new Promise((resolve,reject)=>{
                reject("华润万家")
           })
       }
       let ajax3 = function(){
           return new Promise((resolve,reject)=>{
                reject("盒马")
           })
       }

       Promise.any([ajax1(), ajax2(), ajax3()]).then(res=>{
           console.log(res)
       }).catch(err=>{
           console.log("err", err) // All promises were rejected
       })
    </script>
</body>
</html>

5 WeakRef

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
      //ES6 Set Map

      //ES6 WeakSet WeakMap ES12 WeakRef 
      //weak系列:帮助垃圾回收机制回收这些不可访问的对象

      let obj = {
        name:"kerwin"
      }

      let obj1 = obj // 判断引用计数是否大于0,如果等于0就回收
      obj = null // 垃圾回收机制常用算法:引用计数法、标记清除法     
    
      let s1= new Set()
      s1.add(obj) // 插入到s1中也引用计数 + 1,没有办法回收
      s1.add("aaaaa")
      obj = null // obj依然存在

      //   for(let i of s1){
      //       console.log(i)
      //   }

      /*
        weakset:

        1. 只能复杂类型(对象、数组、函数),不能是基本类型
        2. 不存在引用计数+1
        3. size, for不能用了,里面的内容是不确定能访问到的
      */
      let s2= new WeakSet()
      s2.add(obj) // 不会引用计数,不会 + 1
      //   s2.add("aaaaa")
      obj = null // obj删除了

      //   for(let i of s1){ // 不可迭代,weakset的内容是不确定的
      //       console.log(i)
      //   }
    </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button id="like">like</button>
    <script>
        //WeakMap()

        // let wmap = new WeakMap()
        // let like = document.getElementById("like")

        // wmap.set(like, {click: 0})

        // like.onclick = function(){
        //     let times = wmap.get(like)
        //     times.click++
        // }

        // setTimeout(()=>{
        //     document.body.removeChild(like) // like依然存在
        //     //like = null // like不存在了
        //     console.log(like)
        // }, 2000)


        let wmap = new WeakMap()

        wmap.set(document.getElementById("like"),{click:0}) // 不赋值第三方变量了

        document.getElementById("like").addEventListener("click", function(){
            let times = wmap.get(document.getElementById("like"))
            times.click++
        },false)

        setTimeout(()=>{
            document.body.removeChild(document.getElementById("like")) // 引用依赖dom页面上的节点
        },2000)
    </script>
</body>
</html>

在一般情况下,对象的引用是强引用的,这意味着只要持有对象的引用,它就不会被垃圾回收。只有当该对象没有任何的强引用时,垃圾回收才会销毁该对象并且回收该对象所占的内存空间。

WeakRef 允许您保留对另一个对象的弱引用,而不会阻止被弱引用对象被垃圾回收。

let target = {};
let wr = new WeakRef(target);

WeakRef实例对象有一个deref()方法,如果原始对象存在,该方法返回原始对象;如果原始对象已经被垃圾回收机制清除,该方法返回undefined

let obj = {
			name:"kerwin"
		  }

let wobj = new WeakRef(obj) // 弱引用
//wobj.deref() 拿到原始对象

obj = null // 弱引用不会阻止垃圾回收机制回收,销毁obj,wobj访问不到了
//wobj.deref() undefined
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button id="like">like</button>
    <script>
        //WeakMap()
        let wmap = new WeakMap()
        let like = new WeakRef(document.getElementById("like")) // 弱引用,节点删掉了,访问不到了

        wmap.set(like.deref(), {click: 0})

        like.deref().onclick = function(){
            let times = wmap.get(like.deref())
            times.click++
        }

        setTimeout(()=>{
            document.body.removeChild(like.deref())         
        },2000)      
    </script>
</body>
</html>

6 FinalizationRegistry

清理器注册表功能FinalizationRegistry,用来指定目标对象被垃圾回收机制清除以后,所要执行的回调函数。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        let obj = {
            name:"kerwin"
        }

		// 新建一个注册表实例
        let registry = new FinalizationRegistry(data=>{ // "临终遗言"
            console.log("销毁了", data)
        })

        registry.register(obj, "11111111111111") // 只要obj指向的对象被销毁(obj = null),"11111111111111"传给回调函数调用
        //registry.unregister(obj) // 取消注册
    </script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button id="like">like</button>
    <script>
        //WeakMap()
        let registry = new FinalizationRegistry(data=>{
            console.log("销毁了", data)
        })

        let wmap = new WeakMap()
        let like = new WeakRef(document.getElementById("like"))

        wmap.set(like.deref(), {click:0})

        like.deref().onclick = function(){
            let times = wmap.get(like.deref())
            times.click++
        }

        setTimeout(()=>{
            // 删除节点后,执行回调函数
            registry.register(like.deref(), wmap.get(like.deref()).click)
            document.body.removeChild(like.deref())
        },3000)
    </script>
</body>
</html>

标签:obj,like,前端,特性,let,Promise,new,ES12,wmap
From: https://blog.csdn.net/weixin_45980065/article/details/142499177

相关文章

  • Windows 11 24H2新特性解析:优化安装程序与BitLocker加密管理
    Windows1124H2新特性解析:优化安装程序与BitLocker加密管理随着Windows操作系统的不断更新,微软致力于为用户提供更加流畅、安全的系统体验。在最新的Windows1124H2版本中,微软对安装程序进行了显著改进,同时引入了新的安全特性,其中BitLocker加密的变化尤为引人注目。本文......
  • 前端面试题
    1.缓存前端缓存前端缓存是Web开发中用于提高页面加载速度和减轻服务器负担的一种技术。它主要指的是资源(如HTML、CSS、JavaScript、图片等)在客户端(浏览器)的存储和复用。当浏览器再次请求相同的资源时,如果缓存中存在且未过期,浏览器将直接从缓存中加载资源,而不是向服务器发送请......
  • 福尼斯焊机TPS320i/TPS400i/TPS500i的焊接特性
    福尼斯焊机设备原理TPS320i、TPS400i、TPS500i和TPS600iMIG/MAG电源由微处理器控制,机器人驱动器维修,是完全数字化的逆变器电源。模块化设计和系统的扩展潜力使其具有高度的灵活性。这些设备可适应任何特定的情况。功能原理焊接电源的中央控制系统采用数字信号处理器。……......
  • disp_buffer_flags 枚举定义了一系列用于描述 framebuffer(帧缓冲区)特性的标志位
    disp_buffer_flags 枚举定义了一系列用于描述framebuffer(帧缓冲区)特性的标志位。这些标志位主要用于指示framebuffer的内容是如何组织的,特别是当涉及到立体视觉(3D显示)时。这些标志允许系统或应用程序知道如何正确地处理和显示framebuffer中的数据。下面是对每个标志位的具......
  • 微信小程序-小鱼鲜花前端
    文章目录目录概要小鱼鲜花具体部分代码技术细节小结概要在微信小程序的实例中,前端部分是用户直接交互的界面,它包括了页面布局、用户界面设计、交互逻辑等。前端开发的主要目标是为用户提供一个直观、易用且视觉吸引的购物体验。小鱼鲜花        通过......
  • 前端框架对比及选择:React、Vue、Angular的深度剖析
    前端框架对比及选择:React、Vue、Angular的深度剖析在前端开发领域,框架的选择一直是开发者和团队面临的重要决策之一。随着技术的不断演进,市场上涌现了众多前端框架,但其中React、Vue和Angular无疑是最为流行和备受关注的三大框架。本文将对这三个框架进行详细对比,帮助开发者......
  • 前端八股复习 1
    JWTJWT通常由三部分组成:Header(头部)、Payload(有效载荷)和Signature(签名)。jwt.sign用于生成(签发)JSONWebToken(JWT)。它接受一个有效载荷(payload)、一个密钥(secret),以及可选的配置参数,最终返回一个签名的JWT字符串。一般我的payload会传入用户名和密码这个对象,secret是......
  • 【计算机毕设教程】基于springboot+vue的农产品溯源系统 | 仓库管理系统 | 进销存系统
    【计算机毕设教程】基于springboot+vue的农产品溯源系统|仓库管理系统|进销存系统——前端篇系统演示02.系统功能&业务演示戳我查看页面解析  以采购管理功能为例,这样的一个基本的管理功能页面我们可以将他分为三部分,最顶层为功能介绍区,紧接着是用户搜索......
  • Pbootcms源码上传安装后前端显示错乱乱码问题解决方案
    PbootCMS前端显示错乱或乱码问题可能是由多种原因造成的,下面是一些可能的解决方案:检查字符集设置:确认前端页面的字符集设置是否正确。通常在HTML头部会有一个<meta>标签定义字符集,例如<metacharset="UTF-8">。同时检查PbootCMS后台的字符集设置是否与前端一致,确保数据库和......
  • Pbootcms源码上传安装后前端显示错乱乱码怎么办
    当PbootCMS源码上传安装后,如果前端显示错乱或出现乱码,这通常是由几个常见的原因造成的。以下是针对这种情况的一些解决方案:检查字符编码设置:确认HTML文档头部的字符编码设置是否正确。确保在HTML文档中包含正确的<meta>标签,例如<metacharset="UTF-8">。检查PbootCMS后台的......