可选链操作符( ?. )和空值合并操作符(??)

意外从朋友那里看到的时候百度了下,可能百度方式不对,居然没看到,后面发现还挺好玩的,一个一个来说下;

可选链操作符( ?. )

官方定义

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

用法

在官方文档中看到最多的是简化代码,和不会抛错,那么怎么简化和避免抛错呢呢?上面可能有点不想人话,下面看简单版本

  var obj = {
    
    
                name: 'mk',
                age: '12',
                adress: {
    
    
                    pro: 'hubei',
                    city: 'wuhan',
                }
            }
            // 我们正常写的话,为了避免报错需要先判断有没有obj,
        var lily = obj.adress && obj.adress.as; //'underfined'
        var ll = obj.adress && obj.adress.city; //'wuhan'

        //有了可选链操作符(?.),不需要先确定
        var mm = obj.adress ?.as; //'underfined'
        var ss = obj.adress ?.city; //'wuhan'
        // 等价于
        var tt = obj.adress;
        var ss = (tt == null || tt.city == null) ? 'underfined' : tt.city

在函数中也一样适用
** 如果存在一个属性名且不是函数, 使用 ?. 仍然会产生一个 TypeError 异常 (x.y is not a function).**
在官方中看到这个但是我依然打印报错不知道为何
如果 someInterface 自身是 null 或者 undefined ,异常 TypeError 仍会被抛出 someInterface is null 如果你希望允许 someInterface 也为 null 或者 undefined ,那么你需要像这样写 someInterface?.customMethod?.()

let result = someInterface.customMethod?.(); //这一条报错
let result=someInterface?.customMethod?.(); //这一行在谷歌中依然报错

按照官方文档来说在someInterface后面加上?.即使没有定义也不会报错,但是我报错了,someInterface is not defined

注意

不能用来赋值

let object = {
    
    };
object?.property = 1; // Uncaught SyntaxError: Invalid left-hand side in assignment(赋值时左边无效,本来有值的情况下也抛这个错误)

空值合并操作符(??)

定义

空值合并操作符(??)是一个逻辑操作符,当左侧的操作数为null null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。

使用

他和或(||)不一样,对于或(||)是用布尔类型的值判断,当遇到0,’’,等时会自动判断为false;但是对于*空值合并操作符(??)他只会对null null 或者 undefined 有反应,可以当作一个默认值

var a = '';
var b = null;
var c=a ?? '12'; //''
var d=b ?? '15';// 15
var e=a||'12'; //12
var f=b||'15'; //15

当然这两者也可以一起使用,给一个默认值,当右边为underfined或者null的时候返回??后面的默认值

ending

这里附上官网地址大家可以自己看看,毕竟大哥还是大哥
可选链操作符
空值合并操作符

猜你喜欢

转载自blog.csdn.net/Yannnnnm/article/details/118578654