1. 新增的运算符
1.1 可选链运算符 ?.
可选链运算符( ?.
)允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。
?.
操作符的功能类似于.
链式操作符,不同之处在于:在引用为空(null
或者 undefined
) 的情况下不会引起错误且返回undefined
。
- 与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。
- 当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明。
const adventurer = {
name: 'Alice',
cat: {
name: 'Dinah'
}
};
// 访问对象属性值
const dogName = adventurer.dog?.name;
console.log(dogName); // undefined
// 访问对象的方法函数
console.log(adventurer.someNonExistentMethod?.()); // undefined
1.2 空值合并运算符 ??
空值合并运算符(??
)是一个逻辑操作符,当左侧的操作数为 null
或者 undefined
时,返回其右侧操作数,否则返回左侧操作数。
与逻辑或运算符(||
)不同,逻辑或操作符会在左侧操作数为假值时返回右侧操作数。也就是说,如果使用||
来为某些变量设置默认值,可能会遇到意料之外的行为。比如为假值(例如,’’ 或 0)时。
const foo = null ?? 'default string';
console.log(foo); // "default string"
const baz = 0 ?? 42;
console.log(baz); // 0
2. 新增的原始类型 BigInt
JavaScript
所有数字都保存成 64 位浮点数,导致:
- 数值的精度只能到 53 个二进制位(相当于 16 个十进制位),超过该范围的整数是无法精确表示,不适合进行精确计算。
- 大于或等于2的1024次方的数值,
JavaScript
无法表示,会返回Infinity
。
ES2019
引入了一种新的数据类型 BigInt
(大整数),来解决这个问题,这是 ECMAScript
的第八种数据类型。BigInt
只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。
BigInt
类型的数据必须添加后缀n
,以与Number
类型区别:
1234 // 普通整数
1234n // BigInt
// BigInt 的运算
1n + 2n // 3n
BigInt
也可以使用各种进制表示,但要加上后缀n。
0b1101n // 二进制
0o777n // 八进制
0xFFn // 十六进制
BigInt
与普通整数是两种值,它们之间并不相等。
42n === 42 // false
typeof
运算符对于BigInt
类型的数据返回bigint
。
typeof 123n // 'bigint'
BigInt
可以使用负号(-
),但是不能使用正号(+
)。
-42n // 正确
+42n // 报错