3

当我进行以下比较时,尽管 val() 和 value 在视觉上都显示相同的值,但我得到了错误:12

if ($(this).val() == txt.value)//returns false

当我同时提醒 $(this).val() 和 txt.value 时,我得到 12。其中一个是字符串,另一个是 int 吗?如果是这样,哪个是什么?

4

2 回答 2

8

做一个typeof知道你的价值观的类型。

console.log(typeof $(this).val());
console.log(typeof txt.value);

.val()当使用应该存在的修剪空白时, jQuery 可能已经改变了这些值。为了确保,您可以避免使用val().

thisin.each()以及第二个参数是每次迭代的 DOM 元素。你可以直接得到的值option

$('select > option').each(function(i,el){
   //we should be getting small caps values
   console.log(this.value);
   console.log(el.value);
});

使用松散比较 ( ==) 时,数字 12 和字符串 12 应该相同。更令人惊讶的是,即使字符串周围有空格也是如此。但通过严格比较 ( ===),它们不应该是:

"12"    ==  12  // true
" 12  " ==  12  // true; tested on Firefox 20 (nightly)
"12"    === 12  // false

在这一点上,我们已经清除了所有可以想到的问题。如果没有一个有效,那么首先两者可能是完全不同的值。

于 2012-11-27T06:29:53.573 回答
0

我觉得有必要写这么多评论,我觉得这些评论非常有用,在这里花了这么多时间之后。所以我的问题是:

('#mySelect option').each(function({
  if ($(this).val() == txt.value)
    return;
});
alert('Code still continues');

尽管条件 $(this).val() == txt.value 的结果为真,但每个循环之后的代码仍然执行。这就是为什么我认为这两个值不匹配的原因。但是,如果我在这种情况下发出警报,它就会出现。这意味着每个循环内的“返回”行为有问题。我最近开始明白,虽然 return 会在每个循环内停止执行代码,但它不会阻止代码在每个块之后执行。因此,要在 jquery 的每个循环中实现完整的函数返回,我们似乎必须放置一个标志,并根据该标志决定是否在每个循环之后返回。以下代码对我有用:

var shouldContinue = true;
('#mySelect option').each(function ()
{
    if ($(this).val() == txt.value) {
        shouldContinue = false;
        return (false);
    }
});
if (!shouldContinue)
    return; 

注意迭代中的 return(false)。这意味着,如果条件为真,则不再继续迭代并退出循环。

于 2012-11-27T07:35:26.237 回答