javascript - 在循环中使用逻辑运算符会导致矛盾

标签 javascript jquery regex for-loop logical-operators

我正在处理 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

    };

然后我创建了一个函数,给定两个参数,格式和测试主题,返回 truefalse(仅仅是 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 方法返回 10 而不是 true。但我无法确定它发生的确切时间。

更新 3

事实证明我误用了评论中提到的 &= 运算符。但是……

isValid = isValid && validy.is(validableClass, $field.val());

...当 isValid == truevalidy.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/

相关文章:

php - 如何将数据从 php 文件导入到 javascript 变量

javascript - 如何在用户开始滚动内容时应用滚动动画

javascript - 从Electron中的系统剪贴板复制/粘贴

jquery - Instagram:未获取更新时间

javascript - D3.js - 使用 json 中的嵌套数组绘制图像

java - 我可以这样做 - token=str.split (""| |",");

尝试使用 Regex 查找短语并显示找到的短语的 Java 应用程序

regex - bash 获取最多 2 位数的正则表达式编号

javascript - 如何使用导入/导出 ES6 表示法来转换导出的 require 语句?

javascript - 在 AngularJS 中滚动总是在顶部