1. 可选链式操作符 ?.
当访问的对象属性或调用函数时,检查中间的属性是否存在或为 null/undefined如果为空,表达式将短路返回 undefined,而不会引发错误
let obj = {
data: {
third: 43
}
}
console.log(obj?.data?.third) // 使用可选链式操作符后,只要前面有一个属性为空或者undefined,即返回undefined,不会引发错误
在传统判断写法中,我们通常会这么做,需要手动检查某个属性,或者是具体业务中使用if判断某个属性是不是为 null 或 undefined
obj && obj.data && obj.data.third
2. 空值合并运算符 ??
在变量的值是 null 和 undefined 的时候,为变量提供一个默认值,否则返回变量本身的值
'hello world' ?? 'hi'
// 'hello world'
'' ?? 'hi'
// ''
false ?? 'hi'
// false
null ?? 'hi'
// 'hi'
undefined ?? 'hi'
// 'hi'
**在传统写法中,空字符串以及0,转布尔类型是false,会被默认为假,而在新的语法中,成功的兼容了此问题**
3. 空值合并赋值操作运算符 ??=
当??=左侧的值为 null、undefined 的时候,才会将右侧变量的值赋值给左侧变量,其他所有值都不会进行赋值
let b = '你好';
let a = 0;
let c = null;
let d = '123';
b ??= a; // b = '你好”'
c ??= d // c = '123'
4. "非非" !! 即是在逻辑“非”的基础上再"非"一次。通过!或!!可以将很多类型转换成bool类型,再做其它判断
一般是需要将其他类型强制转换成boolean类型的情况下,比如以下四种场景:
null 和 undefined 为 false
空字符串为 false,非字符串为 true
数值 0 为false,NaN 为 false,其他为 true
任意数组、对象返回 true(包括空数组、空对象)
let a;
let b = null;
alert(!a); // true
alert(!!a); // false
alert(!b); // true
alert(!!b); // false
总结一下,非非(!!)可以理解为是负负得正的结果,即取反再取反。(不过类型被转化成了布尔类型)