使用jQuery检查undefined和null

5

在检查null或undefined时,我有点困惑,不知道是否应该使用!==还是!=以及"undefined"或undefined。

这是我正在处理的一些代码。在我的null / undefined等方面出了什么问题?

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

谢谢


你是否遇到了错误? - DevelopmentIsMyPassion
你一定要调用 toLowerCase() 吗? - Aesthete
@AshReva 不是完全按照这个,但作为试图找出错误的一部分,我正在检查我不确定的事情。 - K Groll
7个回答

14

总的来说,保持简单。

要检查 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()总会返回一个字符串


1
@acowley:不用谢。别担心那些让你做有趣事情的人,比如 typeof foo === "undefined"。那是一种令人困惑、容易出错且不必要的语法。只要不创建一个名为 undefined 的变量,你就没问题了。 - the system
不,我在这里问之前正在考虑使用 typeof。谢谢。 - K Groll

6
  • 无论是null还是undefined都是“falsy”值,因此它们可以像布尔值一样进行检查。因此,除了某些需要知道它们是否是这些值的情况外,没有比较nullundefined的意义。

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

  • 如果前一个条件为“falsy”,则条件中的&&不会评估后续条件。

  • 你甚至不需要jQuery,因为this是你的DOM对象(可能是<a>),你正在尝试获取target属性:

最后:

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

4
仅仅是为了澄清,使用 null 和 undefined 的“假值”属性并不总是最好的选择。这是因为像零和空字符串这样的值也被认为是“假值”,但在许多情况下是允许的值。因此,如果您处于不允许 null 和 undefined 值的情况下,但允许零、空字符串(以及其他“假值”),则需要显式检查 null 和 undefined。 - loesak

1

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

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;

0

我有类似这样的东西,虽然与你的问题无关,但可能会对你有所帮助

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

现在如果你想检查targ是否为null或undefined

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

希望这能对你有所帮助。

0

由于未定义是变量类型,因此请使用typeof

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

我认为,你只需要最后一个检查。如果目标是"_blank",那么c需要是1,否则就是0。如果target没有被设置,这真的很重要吗?

此外,使用attr()方法来获取属性,因为prop()是用于像selectedIndextagName这样的属性。


我认为 OP 是在检查 "target" 属性的有效性,以便可以调用 toLowerCase 方法,否则其他两个检查就没有意义了。 - Aesthete

0
不要重复获取同一个属性三次来检查其值。
var c = 0;
var prop = $(this).prop("target");
if(prop && prop.toLowerCase() === "_blank") c = 1;

0
在JavaScript中,你不需要明确检查变量是否为null或undefined,因为:
  1. null或undefined在布尔表达式中返回false。
  2. JS表达式从左到右求值。所以对于a || b,如果a是false,则只会评估b。但是如果a是true,则不会检查b。同样对于a && b,如果a是false,b将不会被评估。
因此,if(a!= null){“做某事”}可以写成if(a){“做某事”}或者简单地写成a &&“做某事”。
同样地,它可以用于在值设置为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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接