Javascript:为什么要与null进行比较?

Javascript:为什么要与null进行比较?,javascript,Javascript,我参与的一个开源JavaScript项目包括以下代码: if (color) { tapeDiv.style.backgroundColor = color; // set color here if defined by event. Else use css } 一个贡献者想将其更改为 if (color != null) { // this line changed tapeDiv.style.backgroundColor = color;

我参与的一个开源JavaScript项目包括以下代码:

if (color) {
      tapeDiv.style.backgroundColor = color;
      // set color here if defined by event. Else use css
    }
一个贡献者想将其更改为

if (color != null) {  // this line changed
      tapeDiv.style.backgroundColor = color;
      // set color here if defined by event. Else use css
    }
颜色是字符串变量。只有超过0个字符的字符串才能显式设置颜色

既然JS将“”和null强制转换为布尔值false,为什么要进行比较!=需要空值吗

我认为第一种形式和第二种形式一样好(而且稍微短一点),这是不是遗漏了什么

我在JS源代码中经常看到与null的比较。当所有JS简单对象都转换为布尔值时具有已知结果时,为什么需要它们

谢谢

拉里

另外,我假设如果0(一个整数)是一个有效的案例,那么如果(0)为false[一个问题],如果(0!=null)为true[允许0案例]。还有其他原因吗


pps。应该提到tapeDiv是新创建的。因此,没有必要将样式重置为“”,因为div是全新的。

没有,而且您的ps是正确的。Null的计算结果为false,如果需要将Null与空字符串或0区分开来,则需要执行Null检查

或者只是为了清楚起见。更具描述性的是,表示您特别查找null。

backgroundColor=“”有什么作用吗?这是否将颜色设置为默认颜色?如果是这样的话,那么作为重置颜色的一种方式,它是有意义的

如果(颜色){}


如果颜色为“”,则将失败,但在第二种情况下,它将重置背景颜色。

如果颜色可以作为整数输入,则无法将背景设置为黑色(
\000000
=
0
)。

使用所有可能的错误值评估分配,您将得到答案:

tapeDiv.style.backgroundColor = false; // does nothing

tapeDiv.style.backgroundColor = 0;     // sets as "black", 
                                       // but ignored by FF

tapeDiv.style.backgroundColor = null;  // resets the background-color
                                       // to use whatever is defined
                                       // in a stylesheet (if any),
                                       // but ignored by IE.

tapeDiv.style.backgroundColor = '';    // resets the background-color
                                       // to use whatever is defined
                                       // in a stylesheet (if any).
对“
if(color)
”的检查将不允许任何人通过

检查“
if(color!=null)
”将允许1)、2)和4)通过。1) 不做任何事情,2)在Firefox中无法按预期工作,4)始终按预期工作。但是,“工作”取决于您的上下文(您没有提供)

希望有帮助

只能使用超过0个字符的字符串来显式设置颜色

为什么??分配空字符串意味着颜色将被重置(即将使用CSS定义的默认值),这是一个非常有效的用例

您所要做的就是检查是否定义了
color
,即

typeof color !== 'undefined'
或者如果它是一个字符串变量

// checks for primitive strings
typeof color === 'string'

// checks for primitive strings and string objects
typeof color === 'string' || color instanceof String

// checks for primitive strings and string objects, cross-frame safe
Object.prototype.toString.call(color) === '[object String]'
如果它可能包含不正确类型的值。

if(typeof color=='string'&&color.length)

对于typeof,使用“==”就足够了,如果typeof是字符串,那么它将检查color.length。否则,它将在检查第二个条件之前退出。我相信这是最完整的解决办法


但是,如果您确定颜色是一个字符串变量,并且在初始化之前在某个地方定义了颜色,那么您可以像以前一样使用“if(color)”,但是请记住,如果在if语句的那一刻没有定义颜色,您将得到一个ReferenceError。

对我来说,我希望代码稍微短一点,并假设读者理解种姓和布尔逻辑。也许这就是我身上的Ruby程序员。js中的传统做法可能是更详细地解释事情……通常不是这样。记住,JS的源代码实际上是下载的,所以简洁是一个加号。我同意拉里的看法。避免承认JS打字和铸造的工作方式是没有用的。但是jpot(下面)理解将样式设置为0不会在FF上显示黑色,所以不应该使用。这是最全面的答案。简洁并不比确定性行为更重要。