型号误差和短路评估?

时间:2017-10-18 14:28:27

标签: javascript typescript

TS代码

image = this.selectedItem.image.url || null;

错误

TypeError: Cannot read property 'url' of null

我的问题是,为什么不是|| null踢而不是抛出类型错误?

5 个答案:

答案 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.selectedItemthis.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;