如果你用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确实要在三个不同的时间段内查询driver 。driver 是真实的吗?好的,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 💥