检查jQuery中的未定义和空值

Posted

技术标签:

【中文标题】检查jQuery中的未定义和空值【英文标题】:Checking if undefined and null in 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% 的。 【参考方案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 或未定义,因为:

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

    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

【讨论】:

以上是关于检查jQuery中的未定义和空值的主要内容,如果未能解决你的问题,请参考以下文章

具有未定义和空值的排序对象数组

React 呈现未定义和更新的状态

req.session 未定义和 req.session.user_id 不工作

成员变量 - 未定义和不可访问

比较未定义和错误的非常奇怪的行为

无法读取未定义和未处理的承诺拒绝的属性“捕获”