美文网首页Web前端之路
ES2020整理:?和??,动态加载,BigInt,Promis

ES2020整理:?和??,动态加载,BigInt,Promis

作者: 我是皮蛋 | 来源:发表于2020-03-14 16:17 被阅读0次

    ES2020 学习笔记

    原文地址

    1. babel 环境配置

    babel 版本在7.8以上,babel-cli 8以上均支持es2020中的语法,具体可参照本项目的webpack配置
    

    2. es2020 中值得关注的点

    对象定义中的私有变量

    当我们创建一个类的时候,该类会在各个场景下被使用,可能我们并不希望每一个内部的参数都被全局共享,因此在方法或者变量前添加#,使得该方法或者类名只在类内部可用

    class Person {
      #type = "man";
    
      constructor(name) {
        this.name = name;
      }
    
      showType() {
        console.log(`${this.name} is ${this.#type}`);
      }
    }
    
    const jack = new Person("Jack");
    
    jack.showType(); // Jack is man
    
    jack.#type // Error: #type is private value
    
    

    在外部调用私有变量的话就会报错

    使用方法:在类内部属性或者变量前加入#号,使得变量变为私有变量

    Promise.allSettled

    当我们使用多 promise 的时候,特别是当每个 promise 之间存在以来关系的时候,记录每个 Promise 的返回值对错误调试而言是很重要的。使用 Promise.allSettled,创造了一种新的 promise,通过该 promise 所有传入的 promise 全部完成后会返回一个数组,该数组中包含了每一个 promise 的返回值和状态

    const promise1 = new Promise((resolve, reject) =>
      setTimeout(() => {
        resolve({ type: "success", msg: "Yes" });
      }, 1000)
    );
    
    const promise2 = new Promise((resolve, reject) =>
      setTimeout(() => {
        reject({ type: "fail", msg: "No" });
      }, 2000)
    );
    
    Promise.all([promise1, promise2])
      .then(data => {
        console.log("success=");
        console.log(data);
      })
      .catch(data => {
        console.log("fail=");
        console.log(data);
      });
    
    // 过了两秒会显示 { type: "fail", msg: "No" }
    // 使用Promise.all只会返回错误的promise返回的信息
    // 而正确的Promise返回的信息并不会被得到
    
    Promise.allSettled([promise1, promise2]).then(data => {
      console.log("allSettled");
      console.log(data);
    });
    
    /*
    [
        {
            status: 'fullfilled',
            value: { type: "success", msg: "Yes" }
        }, {
            status: 'rejected',
            value: { type: "fail", msg: "No" }
        }
    ]
    
    */
    

    Nullish Coalescing Operator(不知道怎么翻译 QAQ)

    由于 JavaScript 具有动态类型的特点,因此在变量赋值的时候需要记住一个变量在 JavaScript 中的真假值。比如:当一个对象中含有某些之,我们希望给他一个“假”的初始值,之后通过判断来改写他,我们会赋值给他例如数字 0, 空字符串等等。但是如果0和空字符串本身是有意义的,这样做就会存在问题。

    通常情况下使用 || 来进行默认值的赋值

    let person = {
      profile: {
        name: "",
        age: 0
      }
    };
    
    console.log(person.profile.name || "Anonymous"); // Anonymous
    console.log(person.profile.age || 18); // 18
    

    而在对象当中,我们想要赋值的情况是,如果为 null 或者 undefined 的时候,赋予默认值,其他时候保持原样,因此提出了??运算符

    可选链式调用

    类似于??操作符,JavaScript 现在是能够处理值为 undefined 和 null 的情况,但是如果对象或者数组调用的路径是 undefined 会怎么样?

    为了能够通过继续访问该变量,在.操作符之前增加一个?符号,用于模拟出一个可选的路径。

    如果不存在该值,则返回 undefined

    const a = {};
    
    console.log(a.b.c); // 这里会报Err, 无法从undefined中得到c
    
    console.log(person?.profile?.name); // ""
    console.log(person?.hobby?.work); // undefined
    
    console.log(person?.hobby?.work ?? "no Work"); // no Work
    

    可选链式调用在函数和数组上的调用方法

    依然是?和.操作符

    BigInt

    目前 JavaScript 能够处理的最大的数为 2^53,即最大安全整数 Number.MAX_SAFE_INTEGER
    根据你不知道的 JavaScript 中卷中描述,在处理的超过安全范围的数的时候会出现问题
    另外,对于非安全最大数 MAX_VALUE,由于采取的是向接近数取整的原则,更是有各种问题

    如:

    Math.pow(2, 53) === Math.pow(2, 53) + 1; // true
    
    Number.MAX_VALUE + Number.MAX_VALUE === Infinity; // true
    
    Number.MAX_VALUE + 1 === Number.MAX_VALUE; // true
    

    我们可以通过 BigInt 来解决这个问题。通过在数字末尾添加字母 n,来实现一个 BigInt 类型。
    但是我们不能混用 BigInt 和 number 类型,因此在使用运算的时候我们都需要通过 BigInt 类型进行计算

    // BigInt
    a = 1000000000000000000000000000000000000000000000n;
    b = 2n;
    c = 2;
    
    console.log(a * b); // 2000000000000000000000000000000000000000000000n
    console.log(a * c); // Cannot mix BigInt and other types, use explicit conversions
    

    动态加载

    如果你需要在代码中的部分场景中,使用一个工具类中的部分极少的函数,但是我们直接引入依赖可能会造成资源的浪费,现在可以通过 async/await 异步的方式,在我们需要依赖的时候动态加载依赖项

    // add.js
    
    export const add = (a, b) => a + b;
    
    // index.js
    let math;
    
    const useAdd = async (num1, num2) => {
      const _math = math ?? (await import("./add.js"));
    
      math = _math ?? add;
    
      const value = math?.add?.(num1, num2);
    
      console.log(value);
    };
    
    useAdd(1, 2); // 3
    useAdd(4, 5); // 9
    

    相关文章

      网友评论

        本文标题:ES2020整理:?和??,动态加载,BigInt,Promis

        本文链接:https://www.haomeiwen.com/subject/iugwshtx.html