我知道我可以测试 JavaScript 变量,如果它是 undefined
,那么定义它,但是是否有一种方法可以这样说:
var setVariable = localStorage.getItem('value') || 0;
看起来这是一种更清晰的方式,我相信我在其他语言中也见过类似的写法。
我知道我可以测试 JavaScript 变量,如果它是 undefined
,那么定义它,但是是否有一种方法可以这样说:
var setVariable = localStorage.getItem('value') || 0;
看起来这是一种更清晰的方式,我相信我在其他语言中也见过类似的写法。
是的,它可以这样做,但严格来说,如果检索到的值是 falsey,那么它将分配默认值,而不是真正的 undefined。因此,它不仅匹配 undefined
,还包括 null
、false
、0
、NaN
、""
(但不包括 "0"
)。
如果您只想在变量严格为 undefined
时设置默认值,则最安全的方法是编写:
var x = (typeof x === 'undefined') ? your_default_value : x;
在更新的浏览器上,实际上可以安全地编写以下代码:
var x = (x === undefined) ? your_default_value : x;
但请注意,在旧的浏览器中,有可能会通过声明一个名为 undefined
的变量并给它定义一个值来破坏这个功能,导致测试失败。
var x = (x === undefined ? def_val : x);
与稍长的 var x = (typeof x === 'undefined') ? def_val : x;
相比,是否存在缺点?行为是否有所不同? - user2210287undefined
,从而导致相等性测试失败。 - Alnitak||=
的(经常是不需要的)行为,即它匹配任何 "falsey" 值,而不仅仅是严格的 "undefined" 值。遗憾的是,JS 没有这个功能。 - Alnitak浏览器目前正在添加新的运算符,??=
,||=
和&&=
。本文将重点介绍??=
。
这个运算符用于检查左侧是否为undefined
或null
,如果已定义则短路。如果未定义,则将右侧的值赋给左侧变量。
// 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" }
??= 浏览器支持 2022年10月 - 93%
??=
视为无效的语法。默认的自动源代码格式化将把它转换成 ?? =
,中间带有一个空格,而这是无效的 JS 代码。现在需要弄清如何自定义自动格式化程序... - OXiGENrouter["GET"]?.["/admin"] ??= {"/admin": handler};
。也许更深层次的抽象会更好。 - Redu?.
运算符无法正常工作,因为它不会填充缺失的层次,但是在定义的对象的任何深度都可以正常工作。如果a['b']
已定义,则a['b']['c'] ??= d
将起作用。 - Gibolt2018年ES6的答案是:
return Object.is(x, undefined) ? y : x;
如果变量x未定义,则返回变量y,否则如果变量x已定义,则返回变量x。Object.is
并不比===
更好。" === 运算符(以及 == 运算符)将数字值-0和+0视为相等,并将 NaN 视为不等于 NaN。"(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is)在这里无关紧要。 - Trevor DixonNaN
,则使用Object.is
。 - Trevor Dixonundefined
进行比较。因此,===
每次都能正常工作,而不仅仅是 98% 的情况。===
的优点在于它更易于阅读,尤其是一眼就能看出来,更短并且避免了不必要的方法调用。个人认为,只有在情况需要时才使用 Object.is()
,在所有其他情况下都更喜欢使用 ===
。 - blubberdiblub使用空值合并运算符,你可以在value
为null或undefined时设置默认值。
const setVariable = localStorage.getItem('value') ?? 0;
然而,请注意nullish coalescing运算符不会返回其他类型的假值,例如0
和''
这样的值时,不会返回默认值。
但是,请注意浏览器支持情况。您可能需要使用像Babel这样的JavaScript编译器将其转换为更具向后兼容性的内容。如果您正在使用Node.js,则自版本14以来已经支持该运算符。since version 14
我需要在多个地方“设置未定义的变量”。我使用@Alnitak的答案创建了一个函数。希望它能帮助别人。
function setDefaultVal(value, defaultValue){
return (value === undefined) ? defaultValue : value;
}
用法:
hasPoints = setDefaultVal(this.hasPoints, true);
检查typeof
似乎比检查undefined
更合理?我假设您期望一个数字,因为当未定义时将变量设置为0
:
var getVariable = localStorage.getItem('value');
var setVariable = (typeof getVariable == 'number') ? getVariable : 0;
getVariable
不是一个数字(字符串、对象或其他类型),则将 setVariable
设置为 0
。// 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;
您可以使用以下任一方式。
let x;
let y = 4;
x || (x = y)
在ES12或更高版本中
let x;
let y = 4;
x ||= y;
||=
只有在变量为假值时才会设置它,而不是仅仅未定义。 - Sebastian Simonconst result = defaultTo(30)(value)
当处理 undefined
布尔值时,它更加有用:
const result2 = defaultTo(false)(dashboard.someValue)
const result = value || 30;
,只不过使用了中间函数和 +1000 字节的库。 - Adelinfunction 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;
}
}
data.ID = Util.getIfNotSet(data.ID, -1, true);
localStorage.getItem()
将抛出异常,因此你可能需要将其包装在一个try...catch
语句中。 - urish