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

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

这似乎是一种更清晰的方式,我很确定我在其他语言中见过这种情况。


当前回答

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

如果你只想在变量严格未定义的情况下设置为默认值,那么最安全的方法是这样写:

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

在新的浏览器上,这样写其实是安全的:

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

但是请注意,在旧的浏览器中,允许声明一个名为undefined的变量,该变量具有一个已定义的值,这可能会导致测试失败。

其他回答

检查typeof而不是undefined似乎更合乎逻辑?我假设你期望一个数字,因为你设置var为0时未定义:

var getVariable = localStorage.getItem('value');
var setVariable = (typeof getVariable == 'number') ? getVariable : 0;

在这种情况下,如果getVariable不是一个数字(字符串、对象等),setVariable将被设置为0

即使默认值是布尔值也有效:

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

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

如果你只想在变量严格未定义的情况下设置为默认值,那么最安全的方法是这样写:

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

在新的浏览器上,这样写其实是安全的:

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

但是请注意,在旧的浏览器中,允许声明一个名为undefined的变量,该变量具有一个已定义的值,这可能会导致测试失败。

你可以使用以下任何一种方法。

let x;
let y = 4;
x || (x = y)

在ES12或之后

let x;
let y = 4;
x ||= y;

2018年ES6的答案是:

return Object.is(x, undefined) ? y : x;

如果变量x未定义,返回变量y…否则,如果定义了变量x,则返回变量x。