【问题标题】:Javascript: Why compare with null?Javascript:为什么要与 null 比较?
【发布时间】:2009-04-02 00:40:22
【问题描述】:

我从事的一个开源 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 是一个字符串变量。只能使用超过 0 个字符的字符串来显式设置颜色。

既然 JS 将 "" 和 null 转换为 boolean false,为什么需要比较 != null?

我认为第一种形式与第二种形式一样好(而且短一点)是不是错过了什么?

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

谢谢,

拉里

ps。我想如果 0(一个整数)是一个有效的情况,那么 if(0) 将是错误的 [一个问题] 并且 if(0 != null) 将是真的 [允许 0 的情况]。还有什么原因吗?

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

    用所有可能的虚假值评估作业,你会得到答案:

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

    希望对您有所帮助。

    【讨论】:

    • 这是最全面的答案。简洁并不比确定性行为更重要。
    【解决方案2】:

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

    或者只是为了清楚起见。表明您专门寻找 null 会更具描述性。

    【讨论】:

    • 对我来说,我宁愿代码稍微短一些,并假设读者理解种姓和布尔逻辑。也许这只是我的 Ruby 程序员。在 js 中将事情拼写得更冗长可能是传统的......
    • 通常不会。请记住,JS 的源代码实际上是下载的,所以简洁是加分项。我同意拉里。避免识别 JS 键入和转换的工作方式是没有用的。
    【解决方案3】:

    backgroundColor = "" 有什么作用吗?是否将颜色设置为默认颜色?如果是这种情况,那么作为重置颜色的一种方式是有意义的。

    如果(颜色){}

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 但是jpot(下)的理解是,将样式设置为0不会在FF上给出黑色,所以不应该使用它。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-15
          • 2015-01-11
          • 1970-01-01
          • 2017-09-21
          • 1970-01-01
          • 2017-09-25
          • 2012-10-22
          • 1970-01-01
          相关资源
          最近更新 更多