一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
在平时的项目中,时常会用到?.、??和!!,今天就来总结一下这三个运算符的用法:
空值合并运算符??
以下打印结果是什么?
const aa = null ?? 'aaaaa';
console.log(aa);
上面打印的结果是: 'aaaaa'
定义::
??是js中的一个逻辑操作运算符,当左边为null或者undefined时,返回其右侧的操作数,否则返回左侧操作数。
更多例子:
例子1:
const valA = 0 ?? 42;
console.log(valA);
// 0
左侧为0,不是null或者undefined,所以返回??左侧的0,打印结果为0
例子2:
const valB = "" ?? "other";
console.log(valB);
// ""
左侧为"",但不是null或者undefined,所以返回??左侧的"",打印结果为""
与 || 的区别
- 当左侧为 ''或 0时,??返回 0或者 ''
- 由于
||是一个布尔逻辑运算符,左侧的操作数会被强制转换成布尔值用于求值。任何假值(0,'',NaN,null,undefined)都不会被返回。
例3:
let count = 0;
let val = "";
let qty = count || 42;
let message = val || "hi!";
let qty2 = count ?? 42;
let message2 = val ?? "hi!";
console.log(qty); // 返回42,而不是 0
console.log(message); // 返回"hi!",而不是 ""
console.log(qty2); // 返回0,0不是null或undefined,
console.log(message2); // 返回"",""不是null或undefined
不能与||和&&共用
因为空值合并操作符和其他逻辑操作符之间的运算优先级/运算顺序是未定义的,会抛出SyntaxError
可以用括号来表明优先级,
例4:
(null || undefined ) ?? "orange"; // 返回 "orange"
兼容性: IE不兼容
可选链式操作符 ?.
定义:
?. 在引用为空(null或者undefined)的情况下不会引起错误,该表达式短路返回值是undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined
例5:
let data = obj.first?.second;
会先检查obj.first,如果obj.first是null或undefined,则返回undefined,如果不是再返回second
例6:函数的调用
getName?.()
例7:可选链式不能用于赋值
object?.property = 1; // Uncaught SyntaxError: Invalid left-hand side in
!!
定义: 把一个任意类型的值转换为布尔类型
例子8:
!!{} //true
!!0 //false
!!1 //true
!!-1 //true
!!23 //true
!!false //false
!![] //true
!!null //false
!!undefined //false
!!NaN //false
!!NaN //false