• 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}
    // ]
  • 相关阅读:
    tableView滑动时cell消失
    收集别人写的很好的关于多线程的文章
    scroll或是其子类被添加进view时,界面自动上移
    runtime之实现对象序列化
    runtime之方法的交换
    升级mac中的系统之后,给PHP安装扩展常出现问题
    ubuntu下搭建Scrapy框架简单办法
    CuDA的快速下载链接
    windows下Scrapy爬虫框架环境搭建
    windows下安装pywin32报错:close failed in file object destructor:sys.excepthook is missing lost sys.stderr
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/13847300.html
Copyright © 2020-2023  润新知