在JavaScript中设置一个未定义的变量

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

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

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

326797 次浏览

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

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

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

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

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

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

var setVariable = (typeof localStorage.getItem('value') !== 'undefined' && 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);

检查typeof而不是undefined?我假设你在未定义时将变量设置为0时期望一个数字:

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

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

我需要在几个地方“设置一个未定义的变量”。我用@Alnitak answer创建了一个函数。希望它能帮助到某些人。

function setDefaultVal(value, defaultValue){
return (value === undefined) ? defaultValue : value;
}

用法:

hasPoints = setDefaultVal(this.hasPoints, true);

2018年ES6的答案是:

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

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

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

用法:

const result = defaultTo(30)(value)

它在处理undefined布尔值时更有用:

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

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

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

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

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

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

ES2020回答

使用Nullish合并操作符,你可以在value为空或未定义时设置一个默认值。

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

但是,你应该意识到空合并运算符不会为其他类型的假值返回默认值,例如0''

但是,请注意浏览器支持. conf。你可能需要使用像巴别塔这样的JavaScript编译器来将它转换成向后兼容的东西。如果你正在使用Node.js,它已经被支持从版本14开始

在我们的日子里,你实际上可以用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;

逻辑空赋值,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" }

??=浏览器支持 Oct 2022 - 93%

??= Mozilla文档 .

||= Mozilla文档

&&= Mozilla文档

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

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

在ES12或之后

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