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

 更新时间:2022年04月07日 15:43:34   作者:不知名前端  
今天项目中突然遇到了不太明白的写法,下面这篇文章主要给大家介绍了关于JavaScript中.?、??、??=的用法以及含义的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

前言

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

可选链(.?)

如果一个值为null、或者是undefined.那么我们再去用点操作符去调用一个方法或者访问一个属性会发生什么?

let a;
let b = a.name;

如果是上面的这样的代码,那么我们能得到一个报错

其实这种情况就相当于直接在undefined上面访问name属性.undefined和null是两个比较特殊的数据类型,是不能用点操作符去访问属性的.那么在一个变量可能为null、或者undefined的时候,恰巧我又需要访问这个变量的一个属性,那我们应该这样做

let a;
let b;
if(!!a){
    b = a.name;
}else{
    b = undefined;
}

只有当a存在的时候,我才会去访问a的name属性,如果你想再进一步处理,还可以继续判断以下a的数据类型.可是这不是我们今天的重点,就不多讲了.我们可以看到,这样一个简单的逻辑,我们就要写这么多的东西,那么有没有简单的写法呢?看下面的例子

let a;
let b = a?.name;

我们终于看到.?这个东西了,其实这个就叫做可选链,表达的意思,就和刚才if else的例子是一个意思,只有当a存在,同时a具有name属性的时候,才会把值赋给b,否则就会将undefined赋值给b.重要的是,不管a存在与否,这么做都不会报错.

当然我们还可以这么干

let a;
let b;
b = a?.name?.age?.haha?.就是不报错
a?.b?.c(“还是不报错”)

我们看到,你后面可以无限接龙下去,不论有多少属性,只要有最后可以访问到属性,访问到最终的结果,就会赋值给b,否则,就把undefined赋值给b.(这样才有资格叫链式结构嘛)

空值合并运算符(??)

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

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的时候,才会将右侧变量的值赋值给左侧变量.其他所有值都不会进行赋值.同样在一些场景下,可以省略很多代码.

趣味问答时间:

let a;
let b = "不知名前端"
let c = null;
let d = 0;
let e;

e ??= a?.b ?? c ?? d?.a ?? b;
console.log(e)

结果是什么呢???

哈哈一堆的问号.

值得注意的是 :?? 是忽视 null ,undefined 等错误的值

var ibo = {}
console.log(ibo?.a ?? 111) //  111
var ibo = {a:{b:1}}
console.log(ibo?.a?.b ?? 111) //1

console.log(1??'2') //  1
console.log(null ?? "xx") // xx
undefined
console.log(undefined ?? "xx") //  xx
console.log( ' '?? "xx")  //  空值

最后

希望对大家有用,如果方便的话,关注一下,后面我会分享更多前端相关的知识,如果有朋友有想了解的内容,也可以私信我.后面我会找时间分享

到此这篇关于JavaScript中.?、??、??=的用法以及含义的文章就介绍到这了,更多相关js中.?、??、??=用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)

    js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)

    这篇文章主要介绍了js实现有过渡渐变效果的图片轮播相册,兼容IE、ff,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • JS中两个数组对象筛选方法

    JS中两个数组对象筛选方法

    这篇文章主要介绍了JS中两个数组对象筛选,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • 浅谈js常用内置方法和对象

    浅谈js常用内置方法和对象

    下面小编就为大家带来一篇浅谈js常用内置方法和对象。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • js确认删除对话框效果的示例代码

    js确认删除对话框效果的示例代码

    本篇文章主要是对js确认删除对话框效果的示例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • js显示世界时间示例(包括世界各大城市)

    js显示世界时间示例(包括世界各大城市)

    这篇文章主要介绍了js显示世界时间的方法,可现实世界各大城市的当前时间,涉及JavaScript针对时间的获取与运算操作技巧,需要的朋友可以参考下
    2016-04-04
  • JavaScript 作用域scope简单汇总

    JavaScript 作用域scope简单汇总

    这篇文章主要介绍了JavaScript 作用域scope简单汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 无constructor的class类还能new吗问题解析

    无constructor的class类还能new吗问题解析

    这篇文章主要为大家介绍了无constructor的class类是否还能new的问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • JavaScript中的ArrayBuffer详细介绍

    JavaScript中的ArrayBuffer详细介绍

    这篇文章主要介绍了JavaScript中的ArrayBuffer详细介绍,本文讲解了Array 在内存中的堆栈模型、原始缓冲区的创建、数据化数组、DataView对象、XHR2 中的 ArrayBuffer等内容,需要的朋友可以参考下
    2014-12-12
  • 微信小程序滚动、轮播图和文本实例详解

    微信小程序滚动、轮播图和文本实例详解

    轮播图是我们日常开发中经常会遇到的一个需求,下面这篇文章主要给大家介绍了关于微信小程序滚动、轮播图和文本的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 浅谈javascript中的DOM方法

    浅谈javascript中的DOM方法

    DOM就是Html页面的模型,将每个标签都做为一个对象,JavaScript通过调用DOM中的属性、方法就可以对网页中的文本框、层等元素进行编程控制。比如通过操作文本框的DOM对象,就可以读取文本框中的值、设置文本框中的值。
    2015-07-07

最新评论