JavaScript的可选链路

90 阅读2分钟

如果你用JavaScript编程,那么你知道使用对象的好处。它们以一种方式组织我们的数据结构,使我们能够通过查找其键来直接访问值。

而在使用对象时,你肯定熟悉在你的控制台中出现的这种情况......

Uncaught TypeError: Cannot read property '<prop>' of undefined

这往往是因为你正在进行API调用,而响应还没有完成,这是非常正常的。为了对付这种情况,我自己看到并处理了几种不同的方式。在if 语句中使用短路评估是可行的。

让我们用这个作为我们的对象...

const driver = {  name: 'Mary',  car: {    color: 'black',    make: 'Hyundai',    model: 'Elantra',    year: 2021  }}

if 语句的条件...

if (driver && driver.car) {  console.log(driver.car.model);}

这样做没有什么问题,但JavaScript确实要在三个不同的时间段内查询driverdriver 是真实的吗?好的,driver.car 是真实的吗?酷,记录driver.car.model

这当然可以避免日志错误出现在你的控制台,但我们能不能做得更好呢?当然,我们也可以直接在console.log 中做短路评估。

console.log(driver && driver.car && driver.car.model);

这也会避免出现错误日志,并使我们不必写一个if 语句。如果这些评估中的任何一个出现短路,控制台将记录undefined ,而不是查找导致Uncaught TypeError 的下一个评估。

很好!但是,我们可以做得更好吗?但是,我们可以做得更好吗?进入可选链。乍一看,由于问号的放置方式,它似乎有点刺耳,但它清理了我们的代码,而且JavaScript只需要访问我们的对象一次。

console.log(driver?.car?.model);

简单而直接。这就是我所喜欢的

它将检查driver 是否真实,然后检查car 是否真实,最后检查model 。如果其中任何一个是错误的,它将记录undefined ,而不是Uncaught TypeError 。当然,如果它们都是真实的,那么它将记录model 的值。 Bingo, bango, bongo 💥