JS中使用逻辑符-来简化为空判断

7次阅读

共计 1151 个字符,预计需要花费 3 分钟才能阅读完成。

js 中使用逻辑判断符(&&)简化为空判断

在 js 代码中,你会如何进行为空判断?

我们试想这样一个场景,有这样一个对象,其数据结构为:

    const obj = {
        a: {
            b: {c: 'i am c'}
        }
    }

要求是,写一个函数 printLast(value),将上述的对象的 obj.a.b.c 的值返回出来,如果 obj.a.b.c 不存在的话,就返回 ’nothing’,前提是:printLast(value) 的参数可能有各种情况,比如:null, undefined, {}, {a: {}}, ……

对于一个初学者,代码可能是这样的:

    function printLast (obj) {if (obj != null) {if (obj.a != null) {if (obj.a.b != null) {if (obj.a.b.c != null) {return obj.a.b.c} else {return 'nothing'}
                } else {return 'nothing'}
            } else {return 'nothing'}
        } else {return 'nothing'}
    }

还有一种不太严谨的写法:

    function printLast (obj) {
        try {if (obj.a.b.c != null) {return obj.a.b.c} else {return 'nothing'}
        } catch (error) {return 'nothing'}     
    }

这种写法可以达到目的,但是不好。

步入正题,使用 && 简化为空判断

首先,我们回顾以下 && 的执行逻辑。

&& 的执行逻辑

官方的描述:

逻辑运算符通常用于布尔型(逻辑)值。这种情况下,它们返回一个布尔值。然而,&& 和 || 运算符会返回一个指定操作数的值,因此,这些运算符也用于非布尔值。这时,它们也就会返回一个非布尔型值。

大概的意思就是:&& 不仅可以用于布尔型的值,还可以用于表达式,例如:

    let bool = true && (3 === 4)  // 返回 false

其中,3 === 4 是一个表达式,你也可以这样写:

    function f (a, b) {return a === b}
    
    let bool = true && f(3, 4)

我们这样猜想:&& 将 f 函数的值作为返回值,验证一下,如果 f 返回值只是布尔量呢?

    function f (a, b) {return a + b}
    
    let bool = true && f(3, 4) // 返回值为 7 

&& 的为空判断

根据上述,我们如何解决一开始的问题呢?答案是:很简单,请看:

    function printLast (obj) {
        let res = obj && obj.a && obj.a.b && obj.a.b.c // 如果 obj.a.b.c 存在返回其值,否则,返回 undefined
        if (!res) return 'nothing'
        return res
    }

因为 && 的执行是短路的,所以当遇到 undefined 时,就会停止判断。

正文完
 0