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

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时,就会停止判断。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理