我目前使用以下代码
if (oldValue) ...
如果oldValue
为null
,则效果很好,但如果它为0,则在我预期false
时也返回true
。那么,我应该如何检查null
值?我在考虑
if (oldValue!=null) ...
但它没有按照我的预期发挥作用。
答案 0 :(得分:3)
要直接回答您的问题,如果您允许的值为0
且1
,则if
语句应如下所示:
if (0 === oldValue || 1 === oldValue) {
...
}
这是(在我看来)最明确的方式来说明允许哪些值。
有关详细说明,请参阅以下内容:
这与 truthy 和 falsy 值有关。
null
评估为false
,0
,""
,undefined
和NaN
评估为 falsy < / strong>值。
同样,某些值会评估为true
。例如:"a string"
,"0"
(非空字符串“0”),0
以外的任何数字(包括负数),Array
和Object
s(即使是空的)。这些是 truthy 值。
有一些意想不到的结果:
"" == false // true
0 == false // true
但:
NaN == false // false
null == false // false
在实践中,您应始终使用标识运算符===
而不是相等(==
)。这可以确保您知道您的变量的类型(String,Number,Object)以及异常状态。
一些例子:
0
。巧合的是,这是一个 falsy 值。parseInt
或parseFloat
解析字符串中的数字 - 特殊情况NaN
(请与isNaN()
核对)。巧合的是,这是一个 falsy 值。indexOf
检查字符串中是否出现子字符串 - 特殊情况为-1
(因为0
是有效索引)。这是不 falsy 值,但if(str.indexOf(substr))
肯定是错误的,因为目前还不清楚作者是否知道可能允许的值0
(其中是 falsy )这里的要点是:特殊情况通常是明确定义的。利用它可以让您始终使用身份运算符===
。 等于运算符==
和错误是错误的常见来源。
供参考:
"" === false // false
0 === false // false
NaN === false // false
null === false // false
false === false // true (of course)
NaN === NaN // strange, but makes sense
"a" === "a" // yay!
答案 1 :(得分:0)
简短回答:如果您想要准确测试变量是否没有值null
,请将代码更改为:
if (oldValue !== null) ...
(但是,您应该考虑oldValue
可能是undefined
而不是null
,这必须是一个单独的案例。)
有关==
/ !=
和===
/ !==
之间差异的详细信息,请参阅Frits van Campen's answer。