【问题标题】:A question about "undefined" in Javascript关于 Javascript 中“未定义”的问题
【发布时间】:2008-12-03 12:38:55
【问题描述】:

今天我的一个朋友说:

if (typeof isoft == "undefined") var isoft = new Object();

这种代码是大一写的,写的吗

if(!isoft) var isoft = new Object();

我最初认为肯定有一些不同。但我找不到区别。是 有吗?还是这两个例子是一样的?

谢谢。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    查看问题Javascript, check to see if a variable is an object,但请注意Tom Ritter 接受的答案似乎不完整,请查看关于他的答案的评论。另请参阅community answer by Rob

    【讨论】:

      【解决方案2】:

      在您提供的涉及常规对象的示例中,几乎没有区别。然而,另一种典型的模式可以是:

      var radioButtons = document.forms['formName'].elements['radioButtonName'];
      if ('undefined' === typeof radioButtons.length) {
          radioButtons = [ radioButtons ];
      }
      for (var i = 0; i < radioButtons.length; i++) {
          // ...
      }
      

      如果您使用if (!radioButtons.length),它将在未找到单选按钮时评估为真(radioButtons.length 为 0)并创建一个包含单个(不存在)单选按钮的数组。如果您选择使用以下方式处理单选按钮,可能会出现同样的问题:

      if ('undefined' === typeof radioButtons.length) {
          // there is only one
      } else {
          // there are many or none
      }
      

      还有其他涉及空字符串的示例,可能不建议使用 if (!variable),最好针对 typeof undefined 进行测试或显式针对 null 进行测试。

      【讨论】:

        【解决方案3】:

        如果isoft 应该持有对对象的引用,则两者都做同样的事情。 !isoft 对所有假值都为真,但对象不能是假值。

        【讨论】:

          【解决方案4】:

          在您的特定示例中,没有显着差异,因为您正在评估 Object 实例,并且对象在转换为 Boolean 时被转换为 Boolean true,而 undefined 和 null 被评估为 Boolean false。 但以此为例:

          function alertSomething(something) {
              //say you wanna show alert only if something is defined.
              //but you do not know if something is going to be an object or
              //a string or a number, so you cannot just do
              //if (!something) return;
              //you have to check if something is defined
              if (typeof something=='undefined') return;
              alert(something);
          }
          

          当然,我喜欢走捷径并尽可能节省打字,但你必须知道什么时候走捷径,什么时候不走捷径;)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-22
            相关资源
            最近更新 更多