疯狂的 Javascript 问题:undefined 实际上 !== undefined!

3
在有人问之前,我已经搜索了现有的问题并找到了这个问题,但答案是undefined被设置为null,而这里不是这种情况。
以下是我的代码:
check_availability = function () {
    var value = $('#contact_type').val();
    if (value !== undefined) {
        // do some stuff
    }
}

简单明了?我有一个通过ajax填充选项的。最初,选项列表为空,因此jQuery val()返回undefined。到目前为止还不错。
除了if块内的代码总是执行。我在FireBug中的第3行上设置断点,结果如下图所示:
[图片链接](https://istack.dev59.com/cbmKg.webp)
有人能告诉我发生了什么吗?
P.S. 这是Firefox 4.0
编辑:我知道有很多方法可以实现相同的结果,我更感兴趣的是为什么FireBug认为值是undefined,但是!== undefined。

2
http://juhukinners.wordpress.com/2009/01/11/typeof-considered-useless-or-how-to-write-robust-type-checks/ 值得一读。 - ThiefMaster
试试这个疯狂的代码:undefined = 7 - Zirak
6个回答

3

只需检查value的真实性即可。

if (value) {
    // sexy times
}

顺便提一下,当


好的,val() 的值实际上应该是 null。那么你认为这是 FireBug 的一个 bug 吗? - stusherwin
如果value可以合法地为0,就不能仅检查真实性。 - Marcel Korpel
@Marcel:val()返回的是一个字符串,而不是一个数字,尽管数字0是假值,但字符串'0'是真值。在控制台中尝试一下:!!'0'会输出true - Matt Ball
1
啊,我不知道 val() 会返回一个字符串。然而,如果 val() 可以返回一个空字符串,那么 "" == false - Marcel Korpel
@Marcel:是的,val()可以返回空字符串。现在这才是一个有力的观点。 - Matt Ball
显示剩余3条评论

2
val() 永远不会是 undefinedhttp://jsfiddle.net/ThiefMaster/UmZhG/ 如果 <select> 没有选项,则为 null;否则总有一个选定的选项。
值得注意的是,value == undefined 是 true,因为 null == undefined(尽管 null !== undefined)。

1
@Stuart:请看我的回答。jQuery 倾向于避免返回 undefined - Matt Ball
听起来好像还没有执行给它赋值的那一行代码。在函数中定义的 var x 直到第一次赋值之前都是未定义的。 - ThiefMaster
无论 var x = something; 出现在函数的哪个位置,每次出现都会在函数开头创建 var x;。因此,该变量在整个函数中都被定义,但只有在第一次分配后才失去其 undefined 值。 - ThiefMaster
好的,我知道这一点,但是这并不适用于我的情况,因为变量 value 在定义和初始化时同时完成(参见代码)。所以我想问的是,这是如何发生的? - stusherwin
如果您直接进入函数(即调试器位于“var x = something”行上),则该行尚未执行。但是,在此时,变量已经被定义(其值为“undefined”)。 - ThiefMaster
显示剩余3条评论

1

试试这个:

if (typeof(value) != 'undefined') {
    // do some stuff
}

希望能对您有所帮助。

抱歉,我的答案是正确的,但并不能解决你的问题。如果我理解正确,你想要在select元素内没有option标签时才执行某些操作,对吗?如果是这样,请尝试使用以下代码:if ($('#contact_type option').size() > 0) { /* there are options */}。同时,我假设你有一个真正的<select id="contact_type"></select>,而不是你输入的内容。 - Niloct

1

=== 运算符不执行类型转换,这可能导致错误。请尝试使用 == 运算符。或者与 null 进行比较。


1

试着这样做...

if (value != undefined) {
        // do some stuff
    }

0
使用这个:
if($("#contact_type").val() != ""){
//does have a value
}else{
//No value there
}

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