发布于 2026-01-06 2 阅读
0

使用 && 防止对象检索类型错误

使用 && 防止对象检索类型错误

来自 SamanthaMing.com 的代码小贴士

当你检索一个类型为 `None` 的对象值时undefined,程序会因为 `TypeError` 而崩溃!所以务必先使用 ` ifInteger` 语句进行初始检查。更好的做法是,使用 `CREATE TABLE` 重构这段代码&&。👍

&&这种用法有时被称为守卫运算符,因为第一个表达式保护了第二个表达式。换句话说,只有当第一个表达式为真时,才会计算第二个表达式。

const forest = {}

forest.tree // undefined
forest.tree.seed // TypeError 😱


// This will prevent the TypeError but...
if(forest.tree) {
  forest.tree.seed
}

// ✅Much better using &&
forest.tree && forest.tree.seed // undefined
Enter fullscreen mode Exit fullscreen mode

了解 && 运算符

我一直以为它&&只是用来做布尔运算检查的,比如这样:

if(a && b) {
  // do something
}
Enter fullscreen mode Exit fullscreen mode

我以前从没想过可以用 ` &&is` 来求值或者生成某种值。所以当我第一次接触到这个守卫运算符时,我完全懵了。如果你也一样,别担心,理解它需要一些时间。最终帮助我理解它的资源是 Kyle Simpson 的《你不知道的 JavaScript》(You Don't Know JavaScript)这本书。

&&他是这样描述的:不要仅仅把它们看作逻辑运算符,而应该把它们看作选择运算符。它们不会产生布尔值或逻辑值,而是始终选择两个表达式中的一个。用他的话说,它们会选择两个操作数中的一个值

&& 或 || 运算符产生的值不一定是布尔类型。产生的值始终是两个操作数表达式中其中一个表达式的值。

在你彻底放弃之前,我们来看一个例子:

const truthy = true;
const falsy = false;
const money = '💰';

truthy && money; // '💰'
falsy && money; // false
Enter fullscreen mode Exit fullscreen mode

因此money,如果第一个表达式(左侧)为真,则会选中第二个表达式。否则,将选中第一个表达式,而不会计算第二个表达式(右侧)。这被称为短路求值,因为第二个表达式永远不会被计算。

以下是 Kyle Simpson 的著作《你不知道的 JS》中的定义:

如果左侧操作数足以确定运算结果,则不会对右侧操作数进行求值。因此,它被称为“短路运算”(因为如果可能,它会走捷径)。

真值

所以,本质上,第一个表达式(左侧)是真值检查器。如果它为真,则选择第二个表达式(右侧)。如果第一个表达式为假,则使用第一个表达式的值。为了理解什么是真值,我们来详细了解一下🤓

真值列表相当长。所以与其记住哪些是真值,不如记住假值列表来得简单。不在假值列表中的值都被认为是真值👍 (我写过另一篇关于假值的博文,你可以在这里阅读)。

// JS Essentials: Falsy Values

false
undefined
null
NaN
0 or +0 or -0
"" or '' or `` (empty string)

// Everything else is truthy
Enter fullscreen mode Exit fullscreen mode

使用重构if条件语句&&

让我们来看另一个例子,看看 guard 运算符如何也能用于重构条件语句。

const steak = '🥩'
function cook() = {...}

// Most people use `if`
if(steak) {
  cook()
}

// Refactored using &&
steak && cook(); // `cook` only gets called if `steak` is true
Enter fullscreen mode Exit fullscreen mode

这里有一个值得思考的问题:

someCondition && doSomething()
Enter fullscreen mode Exit fullscreen mode

谢谢:@marcdel

提案可选链

这真是太令人兴奋了!ECMAScript 团队或 JavaScript 委员会正在提议引入“可选链式调用”语法。我以前用 C# 的时候,这个功能对我来说简直是颠覆性的。我一直都希望 JavaScript 也能有类似的功能。真心希望这个提案能够通过!🙌

使用建议的可选链式语法重写我们的示例🤩:

// Current
forest.tree && forest.tree.seed

// Proposal
forest.tree?.seed
Enter fullscreen mode Exit fullscreen mode

请勿在您的应用中使用此功能,目前不支持此功能。

点击此处了解更多提案详情


资源


感谢阅读❤
欢迎关注!Instagram | Twitter | Facebook | Medium |博客

文章来源:https://dev.to/samanthaming/prevent-object-retrieval-typeerror-with--37b7