【发布时间】:2021-07-04 15:19:21
【问题描述】:
我正在使用Logical OR (||) operator 来检查和分配值,如果它们不符合以下方式:
let locationDistrict =
result.results[0].address_components[2].long_name ||
result.results[0].address_components[1].long_name ||
result.results[0].address_components[0].long_name ||
'unknown district';
但是当result、result.results、result.results[0] 或address_components 未定义时,我收到以下错误:
Uncaught TypeError: Cannot read property [name_of_property] of undefined
我尝试使用Optional chaining (?.) operator 访问属性来修复此问题,如下所示:
let locationDistrict =
result?.results[0]?.address_components[2]?.long_name ||
result?.results[0]?.address_components[1]?.long_name ||
result?.results[0]?.address_components[0]?.long_name ||
'unknown district';
但它仍然无法分配默认值“未知区”。
我可以通过使用Conditional (ternary) operator 并检查以下虚假值来使代码正常工作:
let locationDistrict =
(result && result.results && result.results[0] && result.results[0].address_components[2]) ? result.results[0].address_components[2].long_name :
(result && result.results && result.results[0] && result.results[0].address_components[1]) ? result.results[0].address_components[1].long_name :
(result && result.results && result.results[0] && result.results[0].address_components[0]) ? result.results[0].address_components[0].long_name :
'unknown district';
但我确信有更好、更优雅的方法来做到这一点。
为什么|| 运算符在其中任何一个链接对象未定义时不获取表达式的“未定义”值?当左侧操作数包含位于连接对象链中的深层属性时,我应该如何使用 || 运算符检查虚假值?
【问题讨论】:
-
您还需要在
[0]之前使用?.。哦,还有address_components索引。 -
更好的方法是将
_.get(result, 'results[0].address_components')的存储结果组合到某个临时变量中,然后继续访问其[0], [1], [2], ...属性。不过,您还不清楚为什么还要处理如此复杂的数据结构。
标签: javascript