我知道我可以测试一个javascript变量,然后在未定义的情况下对其进行定义,但是没有任何说法
var setVariable = localStorage.getItem('value')|| 0;
似乎是一种更清晰的方法,而且我敢肯定我已经用其他语言看到过这一点。
localStorage.getItem()
如果用户禁用了cookie(至少在Chrome中是这样),则将引发异常,因此您可能希望将其包装在一个try...catch
子句中
我知道我可以测试一个javascript变量,然后在未定义的情况下对其进行定义,但是没有任何说法
var setVariable = localStorage.getItem('value')|| 0;
似乎是一种更清晰的方法,而且我敢肯定我已经用其他语言看到过这一点。
localStorage.getItem()
如果用户禁用了cookie(至少在Chrome中是这样),则将引发异常,因此您可能希望将其包装在一个try...catch
子句中
Answers:
是的,它可以做到这一点,但严格来说,如果检索到的值为false,它将分配默认值,而不是真正的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;
?行为是否不同?
undefined
需要重新定义,从而导致相等性测试失败。
||
在未定义的严格测试中使用该方法,而必须在undefined
有条件的情况下使用显式测试。
2018年ES6的答案是:
return Object.is(x, undefined) ? y : x;
如果未定义变量x,则返回变量y ...否则,如果定义变量x,则返回变量x。
Object.is
这没有比===
这更好的了。“ ===运算符(以及==运算符)将数字值-0和+0视为相等,并将Number.NaN视为不等于NaN。” (developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/…)在这里无关紧要。
Object.is
如果两个操作数都可能为,则使用NaN
。
undefined
。因此,===
它将100%地工作,而不仅仅是98%。它的优点===
是易于阅读,尤其是一目了然,更短并且避免了不必要的方法调用。就个人而言,我只会Object.is()
在情况需要时使用,而===
在其他所有情况下都更喜欢。
如果您是FP(功能编程)迷,Ramda为此提供了一个简洁的帮助器函数,称为defaultTo:
用法:
const result = defaultTo(30)(value)
在处理undefined
布尔值时更有用:
const result2 = defaultTo(false)(dashboard.someValue)
const result = value || 30;
,除了使用中间函数和+1000字节的lib
var setVariable = (typeof localStorage.getItem('value') !== 'undefined' && localStorage.getItem('value')) || 0;
localStorage.getItem('value'))
返回,也不会赋0false
今天也遇到这种情况,我不想为多个值覆盖零。对于这样的场景,我们有一个带有一些常用实用程序方法的文件。这是我为处理场景而添加的内容,并保持灵活。
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未定义或为null,则会将ID设置为-1,但不会覆盖0值。
data.ID = Util.getIfNotSet(data.ID, -1, true);
新的运营商目前正在被添加到浏览器??=
,||=
和&&=
。这篇文章将重点关注??=
。
这将检查左侧是否未定义或为null,如果已定义则短路。如果不是,则将右侧分配给左侧变量。
// Using ??=
name ??= "Dave"
// Previously, ES2020
name = name ?? "Dave"
// Before that (not equivalent, but commonly used)
name = name || "Dave" // name ||= "Dave"
let a // undefined
let b = null
let c = false
a ??= true // true
b ??= true // true
c ??= true // false
// Equivalent to
a = a ?? true
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" }
?? =浏览器支持 2020年7月-.03%