ECMAScript 2020 源码阅读笔记

ECMAScript 2020是JavaScript的最新标准,它包含了一些新的语言特性和新的API。在本文中,我们将深入了解ECMAScript 2020的特性,并通过源码阅读的方式来学习和理解这些新特性的实现。

BigInt

BigInt是ECMAScript 2020中的一项新特性,它是一个基于数字的对象类型。在JavaScript中,数字的范围被限制在了 253 -1 的范围内,而使用BigInt对象可以允许我们操作更大的整数。

使用BigInt非常简单,只需要在数字后加一个n即可。

const largeNumber = 9007199254740991n;

在V8引擎中,BigInt的实现方式为使用C++中的整数类型int64_t来实现。我们可以通过V8的源代码来实现BigInt对象。

Optional Chaining

Optional Chaining是一个非常有用的新特性,允许我们在访问嵌套对象时避免出现undefined错误。在以前,我们需要通过&&语句来判断每一个嵌套的对象是否存在,而使用Optional Chaining之后,我们可以更加简洁地访问嵌套对象。

const data = {
  user: {
    name: "John",
    email: "john@example.com",
    address: {
      street: "123 Main St.",
      city: "Anywhere",
      state: "CA",
      zip: "12345"
    }
  }
};

const street = data?.user?.address?.street;

在V8引擎中,Optional Chaining的实现方式为在AST(抽象语法树)转换阶段,将可选的属性操作符包裹在另一个操作符中,形成新的AST节点如 OptionalMemberExpression、OptionalCallExpression 等。我们可以通过阅读V8源代码来更好地理解Optional Chaining的实现方式。

Promise.allSettled

Promise.allSettled的作用是返回一个Promise,当所有的Promises都被解决时,返回一个数组来表示每个Promise的结果。与Promise.all不同的是,Promise.allSettled会等待所有的Promises被解决,而不管它们是被拒绝还是被接受。

const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) => setTimeout(reject, 1000, "Error"));
const promise3 = new Promise((resolve) => setTimeout(resolve, 2000, "Done"));

Promise.allSettled([promise1, promise2, promise3]).then(results => console.log(results))

在V8引擎中,Promise.allSettled的实现方式类似于Promise.all的实现方式,通过遍历Promise数组来解决每个Promise,最终返回包含每个Promise结果的数组。

总结

以上三个新特性都是ECMAScript 2020中非常有用的特性,在我们日常的开发中也会经常使用到。通过阅读V8引擎源代码,我们更好地理解了它们的实现方式,这对我们深入理解JavaScript引擎的工作原理非常有帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65aceb6cadd4f0e0ff67c7f3