空值合并 - 别再让 Falsy 欺骗你
语言瞬息万变。如果你读过我的其他文章,你就会知道我喜欢关注 JavaScript 的最新动态和最精彩的内容。
就在上周,TC39(ECMAScript 背后的委员会)批准了一些很棒的新功能。本周我们将深入探讨空值合并。这个名字有点拗口,不是吗?
让我们来分析一下。
使用或设置默认值
在编程中,我们经常无法确定某个值是否存在,而是希望设置一个默认值。实现这一点有几种不同的方法,但最常见的一种是使用 或 ,用 表示||
。
let snippet = null
let snippet = snippet || "code snippet"
在此示例中,snippet
设置为null
。由于我们始终需要一个字符串,因此我们将使用 或 运算符重新赋值。除非为假值snippet
,否则此表达式将保持不变。当 为假值 时,表达式将解析为“代码片段”。这是因为 JavaScript 中的假值是指“在布尔上下文中遇到时被视为假的值”,就像我们上面的例子一样。snippet
虚假值
或运算符超级好用!但在 JavaScript 中,假值有点棘手。它们不仅包括null
和这样的值undefined
,还包括0
、false
和空字符串。哎呀!这意味着这个表达式的计算结果会和我们想要的略有不同。
let age = 0
let age = age || 1
在这个例子中,age
变成了1
。但这0
是一个有效的年龄!我们不希望这样。我们只想1
在age
不是数字时默认为 。
请注意,有一个函数
isNaN
可以检查这一点,但我们现在忽略这种情况。
我们很快发现,还有很多其他情况也会导致问题。我特别喜欢的是空字符串的情况。通常情况下,你不需要null
字符串变量,因为当你尝试操作它时会抛出错误。但空字符串是可以的。
let message = ""
let message = message || "Welcome to DEV"
然而,在 JavaScript 中,空字符串是假的!所以message
即使我们不想这样,它也会设置为“Welcome to DEV”。
请注意,我们可以检查的类型
stringValue
,但这很烦人。
随之而来的是空值合并
这就是新增功能的全部内容。我们可以||
用空值合并运算符 来替换我们的检查??
。此运算符的使用方法与 大致相同||
,但有一个主要区别。如果 运算符左侧的值是null
或 ,undefined
则将使用默认值(右侧)。否则,将忽略默认值。
让我们看一下这三个例子。
let snippet = null
let snippet = snippet ?? "code snippet"
这仍然会解析为"code snippet"
. snippet
is null
。
如果是零这样的假值怎么办?
let age = 0
let age = age ?? 1
age
仍然是0
!0
不是null
或undefined
,因此运算符的右侧参数被忽略。
最后是我们的空字符串示例。
let message = ""
let message = message ?? "Welcome to DEV"
message
保持为空字符串,正如我们想要的那样。
这太棒了
不是吗?!多年来,Falsy 值引发了不少意外的副作用,让我苦恼不已,所以我对这个功能非常期待。敬请期待其他新功能。接下来我们将讨论可选链式调用。
文章来源:https://dev.to/laurieontech/nullish-coalescing-let-falsy-fool-you-no-more-41c0