zoukankan      html  css  js  c++  java
  • ES2020新增功能

    双问号操作符

    由于JavaScript是动态类型的,因此在分配变量时,我们需要牢记JavaScript对真值/假值的处理。 很多时候数字0和空字符串''就是我们需要的值,我们来看一下下面这个对象

    双管道 ||

    let player = {
      profile: {
        number: 0,
        name: undefined,
        other: ''
      }
    };
    
    console.log(player.profile.number || "未知"); // 未知
    console.log(player.profile.name || "未知"); // 未知

    双问号 ??

    let player = {
      profile: {
        number: 0,
        name: undefined,
        other: ''
      }
    };
    
    console.log(player.profile.number ?? "未知"); // 0
    console.log(player.profile.name ?? "未知"); // 未知

    很多情况下前端从后端获取的数据中,并不确定某个属性存不存在,所以会做个判断,如果不存在就给个默认值避免报错。

    但是数字0和空字符串''通常会被“误伤”,比如nba球星威少、乐福、库兹马都是零号。

    所以双问号可以更准确得去处理 null 和 undefined

    可选操作符

    在点号之前加一个问号

    我太喜欢这个可选操作符了,和双问号异曲同工,配合使用安全加倍。
    相信前端遇到过很多次这种错误:
    Cannot read property 'xxx' of undefined
    有木有???!!!
    有时候是粗心,有时候是拼错属性名,有时候就是后端数据返回有问题。
    直接上代码:

    很多时候会这样处理,看上去没什么问题

    // 假设从后端返回的是一个空对象
    let player = {};
    console.log(player.profile.number || "未知")
    
    // Uncaught TypeError: Cannot read property 'number' of undefined

    可选操作符,操作一下

    let player = {};
    
    console.log(player.profile.number ?? "23"); // player.profile is undefined`
    
    console.log(player.profile?.number ?? "23"); //23

    动态导入

    假设你有一个utils工具文件,则其中某些功能可能很少使用,而导入其所有依赖项会很浪费资源。现在,我们可以使用 async / await在需要时动态导入依赖项。

    const add = (num1, num2) => num1 + num2;
    
    export { add };
    const doMath = async (num1, num2) => {
      if (num1 && num2) {
        const math = await import('./math.js');
        console.log(math.add(5, 10));
      };
    };
    
    doMath(4, 2);

    我在现实项目中就遇到过,比如回帖编辑器,很多人只是看一下别人的回复乐呵乐呵,用户不点击回帖,就没必要去加载整个editor.js

    const replyBtn = document.querySelector('#replyBtn')
    replyBtn.addEventListener('click', e => {
        e.preventDefault()
        (async () => {
            const Editor = await import('./editor.js')
            let editor = new Editor()
        })();
    })
    
    // 也可以
    replyBtn.addEventListener('click', e => {
        e.preventDefault()
        import('/modules/editor.js')
          .then(Editor => {
            let editor = new Editor()
          })
          .catch(err => {
            console.log(err)
          });
    })

    class的私有属性

    类的主要目的之一是将我们的代码包含在可重用的模块中。 我们可能会在很多地方用到这个类,有些属性并不希望被类的外部访问。

    现在,通过在变量或函数前面添加一个简单的哈希符号,我们可以将它们完全保留给类内部使用。

    class People {
      #message = "湖人总冠军"
      bb() { 
        console.log(this.#message) 
      }
    }
    
    const p = new People()
    
    p.bb() // 湖人总冠军
    console.log(p.#message) // Private name #message is not defined

    广州设计公司https://www.houdianzi.com 我的007办公资源网站https://www.wode007.com

    Promise.allSettled

    当我们处理多个Promise时,尤其是当它们相互依赖时,通过Promise.allSettled 可以很好的记录调试或者获取每个promise的状态结果,它会返回一个新的Promise,仅当传递给它的所有Promise都完成时(settled 顾名思义可以理解成定居、稳定)才返回。 这将使我们能够访问一个数组,其中包含每个promise的一些数据。

    相比于Promise.all ,如果传入的promise中有一个失败(rejected),Promise.all 异步地将失败rejected的那个结果给失败状态的回调函数,而不管其它promise是否完成。

    Promise.allSettled 会等所有传入的promise的状态变为 fulfilled 或者 rejected

     
    const p1 = new Promise((res, rej) => setTimeout(res, 1000, 24));
    
    const p2 = new Promise((res, rej) => setTimeout(rej, 1000));
    
    Promise.allSettled([p1, p2]).then(data => console.log(data));
    
    // [
    //   Object { status: "fulfilled", value: 24},
    //   Object { status: "rejected", reason: undefined}
    // ]
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法提高 阮小二买彩票
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 传染病控制
    Java实现 蓝桥杯VIP 算法提高 企业奖金发放
    Java实现 蓝桥杯VIP 算法提高 企业奖金发放
    让程序后台隐藏运行
    只要你喜欢,并且可以养家糊口,就是好的
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/13847300.html
Copyright © 2011-2022 走看看