Javascript:为什么要与null比较?

时间:2009-04-02 00:40:22

标签: 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;
      // set color here if defined by event. Else use css
    }

color是一个字符串var。只应使用超过0个字符的字符串来明确设置颜色。

由于JS转换为“”而null为boolean false,为什么需要比较!= null?

我认为第一种形式与第二种形式一样好(并且稍微短一点),我错过了什么?

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

谢谢,

拉​​里

PS。我想如果0(整数)是一个有效的情况,那么如果(0)将是假[问题]并且如果(0!= null)将为真[允许0情况]。还有其他原因吗?

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

6 个答案:

答案 0 :(得分:18)

使用所有可能的假值来评估作业,您将得到答案:

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)将始终按预期工作。但是,“作品”取决于您的上下文(您未提供)。

希望有所帮助。

答案 1 :(得分:5)

不,你的ps是正确的。 Null将评​​估为false,如果null需要与空字符串或0区分开,那么您将进行空检查。

或者它可能只是为了清晰。表明您特意寻找null是更具描述性的。

答案 2 :(得分:1)

backgroundColor =“”能做什么吗?这会将颜色设置为默认颜色吗?如果是这种情况,那么作为重置颜色的方法就有意义了。

if(color){}

如果颜色为“”,

将失败,但在第二种情况下,它将重置backgroundColor。

答案 3 :(得分:0)

如果颜色可以整数形式出现,则无法将背景设置为黑色(#000000 = 0)。

答案 4 :(得分:0)

  

只应使用超过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]'

如果它可能包含不正确类型的值。

答案 5 :(得分:0)

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

对于typeof足以使用“==”,如果typeof是string,那么它将检查color.length。否则,如果在检查第二个条件之前它将退出。我认为这是最完整的解决方案。

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