为什么是我的|| (或)表现得像&& (和)?

时间:2014-06-20 01:42:02

标签: javascript validation email logical-operators

我希望有人可以帮助我:

我想验证HTML表单上的用户输入(电子邮件地址)。我想要一个' @' (在标志处)和'。' (句点)出现在用户输入字符串中。

以下是检查是否属于这种情况的代码:

function email_checker(id_name){
    var email = document.getElementById(id_name).value;
    if (email.indexOf('@') == -1 && email.indexOf('.') == -1){
    do this code
    }
}

奇怪的是,它适用于|| (逻辑OR)运算符而不是&&。所以,我想这个问题在这个意义上加倍了;

a)如果(逻辑OR)在此代码中完美运行,为什么(逻辑AND)不起作用?

b)为什么(逻辑OR)完美地工作 - 但好像它是(逻辑AND)而不是OR?

(希望有道理:)

我显然错过了一些东西。任何帮助将非常感激。

5 个答案:

答案 0 :(得分:3)

DeMorgan's laws回答了原因。如果你想同时拥有两者,你必须检查has@ and has.;失败的是not(has@ and has.),它会分解为not(has@) or not(has.),我们也可以将其写为hasnt@ or hasnt.。您当前的代码会检查hasnt@ and hasnt.,这相当于not(has@ or has.)(即违反&#34规则的失败;至少有@.,而不一定是&{{1}} #34; - 这不是你想要的规则。)

答案 1 :(得分:0)

如果您希望它同时包含@.,则应检查

email.indexOf('@') > -1 && email.indexOf('.') > -1

或者反过来

email.indexOf('@') == -1 || email.indexOf('.') == -1

请注意,如果indexOf-1,则表示子字符串

答案 2 :(得分:0)

您当前的逻辑表明,如果既没有"@"".",那么执行您的代码(换句话说,如果两者都缺失)。我认为你的逻辑存在缺陷。当您使用&&时,在执行代码之前,您要求两个条件都为真。由于您正在测试.indexOf() == -1,这意味着必须丢失这两个字符才能执行您的代码,这可能不是您想要的。

如果您希望字符串中同时需要"@"".",那么您可以将==更改为!==并仍然使用{{1像这样确保两个必需的字符都存在:

&&

简而言之,如果您希望两个条件必须为function email_checker(id_name){ var email = document.getElementById(id_name).value; // test to make sure neither required character is missing if (email.indexOf('@') !== -1 && email.indexOf('.') !== -1){ // both . and @ are present // execute code here } } ,则整体结果为&&,则使用true。你是对的。但是,您必须确保您正在测试的条件评估为true,并且您的逻辑就是倒退了。当您测试true时,您正在测试是否缺少该字符,因此您的逻辑正在测试是否缺少两个字符(不是缺少一个或零,而是两个)。

答案 3 :(得分:0)

基于此website

  

$ a&& $ b如果$ a和$ b都为TRUE,则为TRUE。

     

$ a || $ b如果$ a或$ b为TRUE,则为TRUE。

<强>&安培;&安培; (AND)只有在满足条件的 时才有效,否则只有在满足 ||的条件时才会有效(OR)

答案 4 :(得分:0)

您希望两个条件都为真,以使电子邮件有效,但您正在检查相反的条件,以便在它失败时捕获。

如果缺少句点,如果缺少句点,则希望它失败,因此您希望在条件之间使用||运算符。