前言
本文将介绍七个即将在浏览器和其他引擎中支持JS新特性
一,类的私有变量
在不久的将来我可以使用 # 符号表示类的私有变量 。这样就不需要使用闭包来隐藏不想暴露给外界的私有变量。
calss Demo {
#x = 0;
#increment(){
this.#x++
}
onClick(){
this.#increment()
}
}
const demo = new Demo()
c.onClick();
c.#increment(); //报错
通过 # 修饰的成员变量或成员函数就成为了私有变量,如果试图在 Class外部访问,则会抛出异常。现在,这个新特性可在最新版本的 Chrome 和 Node.js中使用。
二,可选链操作符
在你编写代码的过程中,当需要访问嵌套在对象内部好几层的属性时,可能会得到一个错误 Cannot read property 'stop' of undefined
,然后你就要修改你的代码来处理属性链中每一个可能undefined 对象,比如:
let Props = obj && obj.first && obj.first.second;
在访问obj.first.second之前,obj和obj.first 的值要被确认非null(且不是undefined)。目的是为了防止错误发生,如果简单直接的访问obj.first.second而不对obj和obj.first 进行校验就有可能产生错误。
有了可选链式调用 ,你只要这样写就可以做同样的事情。
let Props = obj?.first?.second
如果 obj 或 obj.fist是 null / undefinde ,表达式将会短路计算直接返回undefined。
三,空位合并操作符
我们在开发过程中经常会遇到这样的场景:变量如果是空值,则就可以使用默认值,比如:
let c = a ? a : b
let c = a || b
这两种方式有个明显的弊端,它都会覆盖所有的假值,比如 ( 0 ,’ ‘,false),这些值可能是在某些情况下有效的输入。
为了解决这个问题,有人提议创建一个 nullish
合并运算符,用 ?? 表示。有了它,我们仅在第一项为null 或 undefined 时设置默认值。
let c = a ?? b;
//等价于 let c = a!==undefined && a !== null ? a : b;
比如以下代码:
const x = null;
const y = x ?? 500;
console.log(y);//500
const n = 0;
const m = n ?? 500;
console.log(m) //0
四,BingInt
JS在Math上一直都很糟糕的原因之一是:无法精确表示大于数字 2 ^53
,这使得处理相当大得数字变得非常困难。
1234567890123456789 * 123;
// 151851850485185200000 // 计算结果丢失精度
很幸运,BigInt (大整数)就是来解决这个问题。你可以在BigInt上使用于普通数字相同得运算符,例如:+, -, *, %
等等。
创建 BigInt 类型得值也很简单,只需要在数字后面加上 n 即可。
const aNumber = 111;
const aBigInt = BigInt(aNumber);
aBigInt === 111n;//true
typeof aBigInt === 'bigint'; //true
typeof 111 // 'number';
typeof 111n // 'bigint';
1234567890123456789 * 123n;
//输出 151851850485185185047n
不过还是会有一个问题,在大多数操作中,不能将 BigInt 和 Number 混合使用。比较 Number 和 BigInt 是可以的,但是不能把他们相加。
1n < 2 //true
1n+2
//Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions
这个属性只能在最新得 Chrome 和 Node.js 中使用。
剩下三个,在下次再和大家分享。
参考文章:
New JavaScript Features Coming in ES2020 That You Can Use Now。
7 Exciting New JavaScript Features You Need to Know