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

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

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


当前回答

今天也遇到了这种情况,我不想让几个值的0被覆盖。我们有一个文件,其中包含一些用于此类场景的通用实用程序方法。下面是我为处理这种情况而添加的内容。

function getIfNotSet(value, newValue, overwriteNull, overwriteZero) {
    if (typeof (value) === 'undefined') {
        return newValue;
    } else if (value === null && overwriteNull === true) {
        return newValue;
    } else if (value === 0 && overwriteZero === true) {
        return newValue;
    } else {
        return value;
    }
}

然后,如果我想只设置为未定义的值或也覆盖null或0值,可以调用最后两个参数作为可选。这里有一个调用它的例子,如果ID是undefined或null,它会将ID设置为-1,但不会覆盖0值。

data.ID = Util.getIfNotSet(data.ID, -1, true);

其他回答

在我们的日子里,你实际上可以用JS来做你的方法:

// Your variable is null
// or '', 0, false, undefined
let x = null;

// Set default value
x = x || 'default value';

console.log(x); // default value

所以你的例子是有效的:

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

在我看来,对于当前的javascript实现,

var [result='default']=[possiblyUndefinedValue]

是一种很好的方法(使用对象解构)。

如果你是FP(函数式编程)爱好者,Ramda有一个简洁的帮助函数,叫做defaultTo:

用法:

const result = default (30)(value)

它在处理未定义的布尔值时更有用:

const result2 = defaultTo(false)(dashboard.someValue)

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

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

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

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

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