布尔变量表现得很奇怪

时间:2012-08-01 20:52:38

标签: javascript jquery

首先是代码:

function searchItems(){
var noParameters = new Boolean(0);
var formFields = $('form')[0].elements;
for(i=0;1<formFields.length;i++){
    if(formFields[i].type == 'text'){
        if(!(formFields[i].value)){
            noParameters = 0;
        }
    }
}
alert(noParameters.valueOf());
}

在表单提交上调用此函数。它的目的是查看所有类型的表单字段是否&#39; text&#39;没有价值(空输入框)。

我想我应该得到警报。布尔变量在声明时初始化,因此其中有一个值。 if语句都可以正常工作,我已经反复检查过。我在浏览器中唯一的错误是&#34;类型为null或不是对象&#34;这是将表单字段类型与&#39; text&#39;。

进行比较的行

我已经为警报尝试了不同的语法但没有成功:noParameters.toString(),将noParameters.valueOf()分配给变量,然后警告,&#39; true&#39;并且&#39; false&#39;而不是0和1.为什么我的警报不显示?

4 个答案:

答案 0 :(得分:4)

您有一个无限循环,因为条件1 < formFields.length始终为真。但是,i每次都会增加,直到formFields[i]计算为null并且您得到异常,因为您无法访问非对象的type属性。 / p>


对于您的问题:new Boolean(0);为值false创建一个绝对不必要的Object包装器。不要使用它。在循环内部,您最终将0分配给变量。 JavaScript是弱类型的,因此这在语法上是有效的,但仍然很奇怪。

然后,在警报中使用.valueOf()方法。对于数字0,这将起作用,因为它隐式转换为Number实例,但也不常见。如果您只使用了布尔值,则不需要它。

答案 1 :(得分:2)

你在循环中犯了一个错误:你说'while'1

答案 2 :(得分:2)

你可能意味着

for(i=0;i<formFields.length;i++){

答案 3 :(得分:1)

其他人已经指出,1中的1<formFields.length数字输入错误,您应该在i中拥有变量i<formFields.length。但如果你的目的是:

  

“查看”text“类型的所有表单字段是否都没有值(空输入框)。”

然后我会像你这样整理你的功能:

function searchItems(){
   var noParameters = true,
       formFields = $('form')[0].elements;
   for(i=0;i<formFields.length;i++){
      if(formFields[i].type == 'text' && formFields[i].value != ""){
         noParameters = false;
         break;
      }
   }
   alert(noParameters);
}

也就是说,只要找到任何非空白文本字段,就将noParameters设置为false并跳出循环。正如我在上面的评论中提到的,只使用原始值truefalse,不要使用new Boolean()。请注意,您不需要嵌套的if语句:&&运算符使用短路评估,因此只有在左侧条件为真时才会测试右侧条件。

或者,由于您的问题标记为“jquery”,因此以下内容更短(但在运行时效率较低):

function searchItems() {
   var noParameters = $('form input[type="text"]').filter(function(){
                         return this.value != "";
                      }).length === 0;

   alert(noParameters);
}

也就是说,如果具有非空值的文本类型的输入集的长度为0,那么您没有设置参数...

无论哪种方式,在您测试.value时,您可能希望修剪任何空格,以便用户不能通过输入空格来欺骗您的代码:

if(formFields[i].type == 'text' && formFields[i].value.replace(/\s/g,"") != "")