我正在处理 JavaScript 中一个非常非常奇怪的问题。我正在研究一个验证器脚本,它使用 jQuery 循环遍历字段列表。每个验证都与对象上的正则表达式相关联,如下所示:
var formats = { email: /[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/g, phone: /(?!:\A|\s)(?!(\d{1,6}\s+\D)|((\d{1,2}\s+){2,2}))(((\+\d{1,3})|(\(\+\d{1,3}\)))\s*)?((\d{1,6})|(\(\d{1,6}\)))\/?(([ -.]?)\d{1,5}){1,5}((\s*(#|x|(ext))\.?\s*)\d{1,5})?(?!:(\Z|\w|\b\s))/gm, numeric: /(\d+)(((.|,)\d+)+)?/g, url: /^((http\:\/\/|https\:\/\/|ftp\:\/\/)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(\/[a-zA-Z0-9%:\/-_\\?\.'~]*)?$/gi };
然后我创建了一个函数,给定两个参数,格式和测试主题,返回 true
或 false
(仅仅是 test 的包装
RegExp 对象的方法):
validy.is = function(what, str) { return formats[what].test(str); };
在 jQuery 集合中,我有 INPUT
元素,其中的类根据每种格式命名:
<input type="text" class="field email" id="field-1-1" /> <input type="text" class="field phone" id="field-1-2" /> ...
然后,我的验证函数是这样的:
formBuilder.validate = function() { console.info("=== STARTING VALIDATE ==="); var isValid = true; var allFields = $(".field", formBuilder.form).toArray(); var validable = ["email","phone","numeric","url"]; var errors = { "email": "Debés ingresar una dirección de e-mail válida (por ejemplo: juanperez@gmail.com).", "phone": "Debés ingresar un número de teléfono válido.", "numeric": "Debés ingresar un número.", "url": "Debés ingresar una dirección Web válida (por ejemplo: www.misitio.com.ar)." }; for (var f = 0; f < allFields.length; f++) { var $field = $(allFields[f]); console.info($field); console.info("--> Field has classes: " + $field.attr("class")); for (var v = 0; v < validable.length; v++) { var validableClass = validable[v]; if ($field.hasClass(validableClass)) { console.info("--> Validating against " + validableClass + " with value <<" + $field.val() + ">>"); console.info("--> Test result: validy.is(validableClass, $field.val()) = " + vw.validy.is(validableClass, $field.val())); console.info("--> Last value of isValid = " + isValid); isValid = isValid && (validy.is(validableClass, $field.val()) ? true : false); console.info("--> Value of isValid is now = " + isValid); break; }; } console.info("** Status of isValid: " + isValid + " **"); if (!isValid) { console.info("--> Invalid field detected"); //vw.popoverError($field, "Error", errors[validableClass]); break; }; }; return isValid; };
问题在于,即使字段值有效且 isValid == true
,当它执行 isValid == isValid && ...
操作时, isValid
最终为 false
。
true && true
表达式怎么可能抛出 false
。
我知道肯定有一些我看不到的愚蠢,但我似乎找不到它。任何人都可以帮助解决这个问题吗?
谢谢!
更新 1
最初,行:
isValid = isValid && (validy.is(validableClass, $field.val()) ? true : false);
是
isValid &= validy.is(validableClass, $field.val();
更新 2
在某些时候,显然 test
方法返回 1
或 0
而不是 true
或 假
。但我无法确定它发生的确切时间。
更新 3
事实证明我误用了评论中提到的 &=
运算符。但是……
isValid = isValid && validy.is(validableClass, $field.val());
...当 isValid == true
和 validy.is
独立返回 true
时返回 false
。
更新 4
根据CaffGeek的回答更改了validy.is
的定义:
validy.is = function(what, str) { return !!formats[what].test(str); };
不幸的是,它没有效果。
最佳答案
我经常使用 !!variable 来确保变量存在并且它具有正值。
如果它是未定义的或假的,!!variable 将返回假,如果它已定义且为真或有一个值(非 0)它将返回真
关于javascript - 在循环中使用逻辑运算符会导致矛盾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13422292/