如何检查变量是否为null,但允许1和0?

时间:2012-03-03 20:41:26

标签: javascript

我目前使用以下代码

if (oldValue) ...

如果oldValuenull,则效果很好,但如果它为0,则在我预期false时也返回true。那么,我应该如何检查null值?我在考虑

if (oldValue!=null) ...

但它没有按照我的预期发挥作用。

2 个答案:

答案 0 :(得分:3)

要直接回答您的问题,如果您允许的值为01,则if语句应如下所示:

if (0 === oldValue || 1 === oldValue) {
     ...
}

这是(在我看来)最明确的方式来说明允许哪些值。

有关详细说明,请参阅以下内容:


这与 truthy falsy 值有关。

null评估为false0""undefinedNaN评估为 falsy < / strong>值。

同样,某些值会评估为true。例如:"a string""0"(非空字符串“0”),0以外的任何数字(包括负数),ArrayObject s(即使是空的)。这些是 truthy 值。

有一些意想不到的结果:

"" == false     // true
0 == false      // true

但:

NaN == false    // false
null == false   // false

在实践中,您应始终使用标识运算符===而不是相等(==)。这可以确保您知道您的变量的类型(String,Number,Object)以及异常状态。

一些例子:

  • 如果您从输入字段获取值,它将始终是一个字符串 - 特殊情况是空字符串。巧合的是,这是一个 falsy 值。
  • 如果你在计算元素,并且你需要做一些特殊的事情,如果没有元素 - 特殊情况是0。巧合的是,这是一个 falsy 值。
  • 如果您尝试使用parseIntparseFloat解析字符串中的数字 - 特殊情况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