如果在 JavaScript 中未定义,则设置变量逻辑空赋值,ES2020+ 解决方案

2022-08-30 00:40:40

我知道我可以测试一个JavaScript变量,然后定义它,如果它是,但是没有某种说法undefined

var setVariable = localStorage.getItem('value') || 0;

似乎是一种更清晰的方式,我很确定我已经在其他语言中看到了这一点。


答案 1

是的,它可以做到这一点,但严格来说,如果检索到的值是假的,而不是真正未定义的,它将分配默认值。因此,它不仅匹配,而且匹配 ,, , , (但不是 )。undefinednullfalse0NaN"""0"

如果只想在变量严格时设置为默认值,那么最安全的方法是编写:undefined

var x = (typeof x === 'undefined') ? your_default_value : x;

在较新的浏览器上,实际上可以安全地编写:

var x = (x === undefined) ? your_default_value : x;

但请注意,在较旧的浏览器上可能会破坏这一点,在这些浏览器中,允许声明具有已定义值的名为的变量,从而导致测试失败。undefined


答案 2

逻辑空赋值,ES2020+ 解决方案

当前正在向浏览器 、 、 和 添加新的运算符。这篇文章将重点介绍.??=||=&&=??=

这将检查左侧是否为 或 ,如果已定义,则短路。否则,右侧将分配给左侧变量。undefinednull

比较方法

// Using ??=
name ??= "Dave"

// Previously, ES2020
name = name ?? "Dave"

// or
if (typeof name === "undefined" || name === null) {
    name = true
}

// Before that (not equivalent, but commonly used)
name = name || "Dave" // Now: name ||= "Dave"

基本示例

let a       // undefined
let b = null
let c = false

a ??= true  // true
b ??= true  // true
c ??= true  // false

对象/数组示例

let x = ["foo"]
let y = { foo: "fizz" }

x[0] ??= "bar"  // "foo"
x[1] ??= "bar"  // "bar"

y.foo ??= "buzz"  // "fizz"
y.bar ??= "buzz"  // "buzz"

x  // Array [ "foo", "bar" ]
y  // Object { foo: "fizz", bar: "buzz" }

??= 浏览器支持九月 2021 - 90%

??= Mozilla 文档

||= Mozilla 文档

&&= Mozilla Documentation