共计 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