【问题标题】:Checking if undefined and null in jQuery检查jQuery中的未定义和空值
【发布时间】:2013-02-06 09:38:38
【问题描述】:

在检查 null 或 undefined 以及是否应该使用 !==!= 和“未定义”或未定义时,我有点困惑。

这是我正在处理的一些代码。我的 null/unudefined 等哪里出了问题?

var c = (jQuery(this).prop("target") != null && jQuery(this).prop("target") != undefined && jQuery(this).prop("target").toLowerCase() == "_blank") ? 1 : 0;

谢谢

【问题讨论】:

  • 您遇到错误了吗?
  • 您绝对必须致电toLowerCase()吗?
  • @AshReva 不完全是这样,但作为试图找出错误的一部分,我正在检查这样的事情,我不是 100% 的。

标签: javascript jquery ternary-operator


【解决方案1】:

一般来说,保持简单。

要检查undefined,请使用:

foo === undefined
foo !== undefined

要检查null,请使用:

foo === null
foo !== null

要同时检查任何一个,请使用:

foo == null
foo != null

无论如何,请将您的.prop() 存储到一个变量中以保持其干净。但在你的情况下,如果它等于"_blank",那么你就知道它不是nullundefined,所以:

var targ = jQuery(this).prop("target").toLowerCase();

var c = targ === "_blank" ? 1 : 0;

或者您可以通过将 boolean 强制为 number 来缩短它:

var targ = jQuery(this).prop("target").toLowerCase();

var c = +(targ === "_blank");

最后两个解决方案是安全的,因为.prop() 将始终返回string

【讨论】:

  • 这是一个很好的解释。谢谢。
  • @acowley:不客气。不要担心那些告诉你做一些有趣的事情的人,比如typeof foo === "undefined"。这是一种令人困惑、容易出错且不必要的语法。永远不要创建一个名为 undefined 的变量,你会没事的。
  • 不,先生。在问这里之前,我正在考虑沿着typeof 路径前进。干杯。
【解决方案2】:
  • nullundefined 都是“假”值,因此可以像检查布尔值一样检查它们。因此,与nullundefined 相比是没有意义的,除非在某些情况下您需要知道它们是否是这样的值。

  • 比较时最好使用严格比较(如===,!==等)

  • 如果条件中的&& 前面的条件是“假的”,则它不会评估后面的条件。

  • You don't even need jQuery 因为this 是您的DOM 对象(可能是<a>)并且您正在尝试获取target 属性:

最后:

var c = (this.target && this.target.toLowerCase() === "_blank") ? 1 : 0;

【讨论】:

  • 只是为了澄清,使用 null 和 undefined 的“虚假”属性并不总是最好的。这是因为诸如零和空字符串之类的值也被认为是虚假的,但在许多情况下可能是允许值。因此,如果您的情况是 null 并且不允许使用未定义的值,但允许使用零和空字符串(以及其他虚假值),则需要显式检查 null 和未定义。
【解决方案3】:

这是检查未定义的最佳方法:

if(typeof variable_here != 'undefined'){
   // your code here.
 };

这是检查 null 的最佳方法:

if(variable_here !== null){
       // your code here.
     };

所以你的代码应该是这样的:

var c = (jQuery(this).prop("target") !== null && typeof jQuery(this).prop("target") !== 'undefined' && jQuery(this).prop("target").toLowerCase() == "_blank") ? 1 : 0;

【讨论】:

    【解决方案4】:

    因为 undefined 是变量类型,所以使用typeof

    var c = (
     $(this).attr("target") != NULL && 
     typeof $(this).attr("target") != "undefined" && 
     $(this).attr("target").toLowerCase() == "_blank"
    ) ? 1 : 0;
    

    但是,我认为您只需要最后一次检查。目标是"_blank"c 必须是1,否则,0target 是否设置真的很重要吗?

    此外,使用attr() 方法获取属性,因为prop() 用于selectedIndextagName 等属性。

    【讨论】:

    • 我认为 OP 正在检查“目标”属性的有效性,以便他们可以对其调用 toLowerCase 方法,否则其他两个检查毫无意义。
    【解决方案5】:

    不要仅仅为了检查一个值而获取相同的属性 3 次。

    var c = 0;
    var prop = $(this).prop("target");
    if(prop && prop.toLowerCase() === "_blank") c = 1;
    

    【讨论】:

      【解决方案6】:

      我得到了这样的东西,与你的问题无关,但会帮助你

      var targ = jQuery(this).prop("target").toLowerCase();
      

      现在如果你想检查 targ 是 null 还是 undefined

       var c = (!targ || "") ? 1 : 0
      

      希望对你有帮助

      【讨论】:

        【解决方案7】:

        在 JavaScript 中,您不需要显式检查变量是否为 null 或未定义,因为:

        1. null 或 undefined 在布尔表达式中返回 false。

        2. JS 表达式从左到右计算。所以对于一个 || b,如果 a 为假,则只评估 b。但如果 a 为真,则不会检查 b。同样,对于 a && b,如果 a 为 false,则不会计算 b。

        因此,if (a != null) { "do something" } 可以写成 if (a) { "do something" } 或简单的 && "do something"。

        同理,当值设置为null或undefined时,可以用来设置默认值:

        function someFunction(age){
            var age= age|| 18;
        }
        

        参考:https://codereview.stackexchange.com/questions/472/usage-of-the-ternary-operator-with-functions-listening-to-click-events

        【讨论】:

          猜你喜欢
          • 2012-05-26
          • 1970-01-01
          • 1970-01-01
          • 2013-07-14
          • 1970-01-01
          • 2014-01-23
          • 2023-04-01
          • 2012-11-03
          • 2021-09-27
          相关资源
          最近更新 更多