js中的运算符——?.和??、!!

195 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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''NaNnullundefined)都不会被返回。
例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