TS代码
image = this.selectedItem.image.url || null;
错误
TypeError: Cannot read property 'url' of null
我的问题是,为什么不是|| null踢而不是抛出类型错误?
答案 0 :(得分:3)
您拥有的最短选项是:
image = this.selectedItem && this.selectedItem.image && this.selectedItem.image.url || null;
如果&&
中的任何一个失败,您将获得null
,但您必须检查您尝试访问的对象的每个“级别”。
这是有效的,因为&&
优先于||
的操作顺序。以上陈述类似于:
x = (((a.b) && (a.b.c)) && (a.b.c.url)) || null;
另一方面,你拥有的东西类似于:
x = (a.b.c.url) || null;
如果url
没有属性a.b
,则无法获取c
。这就是错误所引发的错误,而这不是“或”最终可以捕获的东西。
答案 1 :(得分:1)
我认为您对"short-circuit"的含义感到困惑。布尔运算符从左到右(&&
之前||
但是从左到右)进行评估,直到结果确实是假的或真实的,然后它停止而不评估任何其他内容。在您的情况下,在评估this.selectedItem.image.url
时发生错误,并且永远不会到达||
运算符。
JavaScript缺少null/undefined-coalescing" ?.
"等Elvis operator运算符,可让您执行this.selectedItem?.image?.url
之类的操作来阻止解除引用{ {1}}值。
相反,您需要检查每个可能的嵌套属性是否存在,如果它们可能未定义:
undefined
(我确定其他答案都提到了类似的东西......嗯,是的,@ Cerbrus有它)这个现在正以一种帮助你的方式进行短路。只要其中一个项目是假的,整个括号内的术语评估为假,而不会抛出错误。然后你会得到麻痹 - image = (this.selectedItem && this.selectedItem.image && this.selectedItem.image.url) || null;
,它会变成|| null
,如你所愿。
希望有所帮助;祝你好运!
答案 2 :(得分:0)
您正在检查this.selectedItem.image.url
,但为了实现这一目标,您需要确保先this.selectedItem
和this.selectedItem.image
存在。
您可以尝试以下方法:
image = this.selectedItem && this.selectedItem.image ? this.selectedItem.image.url || null : null;
答案 3 :(得分:0)
您还需要检查字段image
是否存在。尝试使用三元运算符:
image = this.selectedItem.image ? this.selectedItem.image.url : null;
答案 4 :(得分:0)
因为在this.selectedItem.image.url
本身被评估时发生了错误。你可以这样修理它:
this.selectedItem.image = this.selectedItem.image || {}
image = this.selectedItem.image.url || null;