js中?.、??、??=的用法以及含义

286 阅读2分钟

前言:在项目中我们往往要做很多很多的空值判断进行容错处理,往往伴随着三目运算、与或、if else来使用,不仅要写很多冗余的代码,后期维护起来也是满屏的if else可以说是非常的痛苦了.今天分享几个处理空值简单的方法,希望可以解决大家的一些问题.

可选链运算符(?.)

允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 运算符的功能类似于 . 链式运算符,不同之处在于,在引用为空 (nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined

let a;
let b = {name:'xxx'}
let c = [1,2,3]
let d = a?.name; // undefined
d = b?.name; // 'xxx'
d = b?.['name']; // 'xxx'
d = c?.[0]; // 1

拿 let d = a?.name;举例,意思是只有当a存在,且a有name这个属性时,才会把a.name的值赋给d,否则会给d赋值undefined,且不会报错

let a = {
	getName:()=>{
		return '123'
	}
}
let result1 = a?.getName?.(); // 123
let result2 = a?.setName?.(); // undefined

与函数调用一起使用时,如果给定的函数不存在,则返回undefined,不会报错

注意:  如果被当作方法调用的是一个属性,使用?.还是会报错

空值合并运算符(??)

有了上面的例子,接下来我们简单一点,直接上举例

let b;
let a = 0;
let c = { name:'buzhimingqianduan' }

if(!!a || a === 0 ){
	b = a;
}else{
	b = c;
}

对就是上面那个例子,当我们想判断一个值存在,但是它等于0的时候,我们也需要当作它存在,于是就有了上面那样的例子,其实我们还可以这样做

let b;
let a = 0;
let c = { name:'buzhimingqianduan' }

b = a ?? c;

上面的例子,当a除了undefined、或者null之外的任何值,b都会等于a,否则就等于c.

空值赋值运算符(??=)

let b = '你好';
let a = 0
let c = null;
let d = ’123‘
b ??= a;  // b = “你好”
c ??= d  // c = '123'

当??=左侧的值为null、undefined的时候,才会将右侧变量的值赋值给左侧变量.其他所有值都不会进行赋值.同样在一些场景下,可以省略很多代码.