前言
ECMAScript(简称 ES)是一种基于 JavaScrip 的标准化脚本语言,由 ECMAScript 的国际标准化组织 ECMA(European Computer Manufacturers Association)制定。每年都会发布新的规范,2015 年推出的规范(ES6)对于 JavaScript 产生了重大的影响,带来了许多优秀的特性和语法,如箭头函数、类、解构赋值、let、const 等。
随着时间的推移,JavaScript 语言也在持续的发展中。在 2020 年, ECMAScript 2020 规范草案作为新的版本发布,它是 ECMAScript 的第 11 个版本。本篇文章将详细介绍这个草案对 JavaScript 的影响以及相应的学习和指导意义。
Nullable 类型
在 JavaScript 语言中,变量可以赋值为任何的类型,这就导致了在处理应用的时候需要更多的判断语句和异常处理。一般情况下,在 null 或 undefined 的时候需要做特殊处理。ECMAScript 2020 规范草案中提出了 Nullable 类型,解决了这个问题。
Nullable 类型的变量需要明确声明为可为空,当变量为空时,就会自动执行一个特定的方法处理方式。下面是一个示例:
let firstName: ?string = 'Tomas'; let lastName: ?string = undefined; console.log(firstName ?? 'N/A'); console.log(lastName ?? 'N/A');
在上述代码中,声明了 firstName 和 lastName 两个变量,其中 firstName 赋值了一个字符串,而 lastName 赋值了 undefined。当使用 ?? 运算符时,在 firstName 变量输出 'Tomas' 的值,而 lastName 变量输出 'N/A' 的值。这是因为 lastName 被声明成了可为空的变量类型,所以在变量为空时,输出 'N/A'。
值得注意的是,在某些情况下,可能需要显式地声明变量为空。比如声明了一个变量类型是 string,而在后续的代码执行中,却有可能会变成 null。这时候,可以用 type Nullable 来明确一个变量类型时可为空的。
type NullableString = string | null; let fullName: NullableString = 'Tomas Smith'; fullName = null; console.log(fullName);
在上述代码中,声明了一个类型变量 NullableString,它是 string 和 null 类型的联合类型,表示 fullName 变量可以是一个字符串或者是 null。当将 fullName 变量赋值为 null 时,输出 null。
这个特性改善了语言的灵活性和可用性。当开发者处理 JavaScript 应用程序时,不需要再担心变量类型和未定义的情况,也减少了异常和错误处理的码量和复杂度。
私有类属性和方法
在 JavaScript 中,往往没有对于属性和方法的私有封装支持,因此使用 Closure 或者 Function 声明作为私有属性和方法的方案。这种方式虽然可以达到类似于私有变量和方法的效果,但是会造成作用域的污染和闭包造成的性能问题。
在 ECMAScript 2020 规范草案中,对于私有类属性和方法进行了支持,符合大部分面向对象语言的语法结构。声明私有属性和方法可以使用 # 进行标示,示例如下:
-- -------------------- ---- ------- ----- ------ - ----- - --- ----------------- - ---------- - ----- - ------- - ------------------- -- ---- -- ---------------- - - ----- --- - --- -------------- ------------ -- -- ------- -- ---- -- ---- ----------------------- -- -- ----------- ----
在上述代码中,使用 #name 声明了私有属性,在类的外部是无法访问到这个属性的。执行 tom.greet() 方法可以输出结构,而尝试输出私有属性却会抛出一个异常。
除了私有属性,我们也可以使用 # 声明私有方法。在类外部是无法访问到这个方法的,只能在类的内部调用它。示例如下:
-- -------------------- ---- ------- ----- --- - ------ - --- ------------------ - ----------- - ------ - ------------- - ----------- - ------ - -------------- - ----------------- --- -- ----------------- - ------------------ - ------------------- - - ----- --- - --- ----------- ------------------- -- -- ----- --- -- ---- ------------------------ ------------------- -- -- ----- --- -- ----- ------------------------ -- -- ----------- ----
在上述代码中,使用 #paint() 方法更改了私有属性 #color。通过 Car 类的实例化对象 BMW 对象调用了 displayColor() 和 changeColor() 方法,分别输出当前汽车的颜色,和将汽车颜色更改成小蓝色后输出相应的信息。
BigInt 类型
JavaScript 语言中,Number 类型代表了数值,但是它的取值范围是 2 的 -53 到 2 的 53 次方之间。在计算比较大的数据或者精度较高的需求场景时,过大或过小的数值可能会造成数据精度的丢失。考虑到这个问题,ECMAScript 2020 规范草案加入了 BigInt 类型,解决了这个问题。
BigInt 类型的变量可以存储任意大小的整数(不限制位数),示例如下:
const big1 = BigInt(Number.MAX_SAFE_INTEGER) + 1n; const big2 = BigInt(Number.MAX_SAFE_INTEGER) + 2n; const big3 = big1 + big2; console.log(typeof big1); // 输出 "bigint" console.log(big1); // 输出 "9007199254740992n" console.log(big2); // 输出 "9007199254740993n" console.log(big3); // 输出 "18014398509481985n"
在上述代码中,BigInt 类型可以使用后缀 n 进行标识。通过执行类似以上的代码,在 BigInt 类型的变量中存储不同的数值,包括超过 Number 类型的最大取值范围。
在处理更大、更复杂的问题时,JavaScript 语言中 BigInt 的优势就能体现出一定的价值,同时也能提高代码的性能和可读性。
总结
ECMAScript 2020 规范草案的发布对于 JavaScript 语言来说,是一个重要的里程碑。Nullable 类型、私有类属性和方法、BigInt 类型等新特性被加入其中,这些特性在提高代码的执行效率和错误处理方面有着明显的改善和优化。
每个特性都有自己的优势和限制,当使用新特性应该在遵循规范和保证代码易读性和可维护性的原则下做出合理的判断。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64d05553b5eee0b52574bb2e