共计 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 时,就会停止判断。
正文完
发表至: javascript
2019-07-18