2011-10-22 28 views
4

當我決定使用經典javascript構建普通的Web表單驗證時,出現奇怪的錯誤。有幾個用於輸入文本字段的「onblur」處理程序和一個「表單提交」處理程序。JavaScript是否在布爾表達式中使用優化?

當我使用他們喜歡的是:「passwordCheck」如果loginCheck失敗從來沒有所謂:

function loginCheck() { 
    ... return true of false 
} 

function passwordCheck() { 
    ... 
} 

function formValidation() { 
    return loginCheck() && passwordCheck(); 
} 

,因爲我希望它不工作!

最後,我有解決辦法

function formValidation() { 
    ok = loginCheck(); 
    ok &= passwordCheck(); 
    return ok; 
} 

現在執行密碼檢查。但是,當我選擇:

function formValidation() { 
     ok = loginCheck(); 
     ok = ok && passwordCheck(); 
     return ok; 
    } 

passwordCheck永遠不會再次調用如果loginCheck失敗。

此外:loginCheck & passwordCheck返回布爾值,但& =運算符將其轉換爲「0」或「1」。 「0」對我的onsubmit="return checkForm"處理程序不起作用。我不得不將我& =結果再次布爾:

function formValidation() { 
     ok = loginCheck(); 
     ok &= passwordCheck(); 
     return ok != 0; 
    } 

這是JavaScript引擎一種正常的行爲?

+5

'&'是按位與,並將始終返回一個數字。 '&&'是邏輯與,並且將返回表達式的值,它決定了整體結果。將任何值轉換爲布爾值的快捷方式是使用雙重否定'!!'。 –

+0

可以以某種方式改變可怕的標題?我想不出那些清晰而又有吸引力的東西。 – Lekensteyn

+0

如果在登錄檢查失敗後需要進行密碼檢查,則需要進行一些重構。 – hyperslug

回答

7

是的,這是正常的。它被稱爲short-circuit evaluation,既方便又很常見(即以很多語言(C,C++,Java,Perl,許多其他語言),而不僅僅是JavaScript)。

+0

多麼愚蠢的我:) –

1

如果你想明確地運行這兩個功能,您可以選擇只有當被評估運行&&

var l = loginCheck(), // will evaluate 
    p = passwordCheck(); // will evaluate 

return l && p;   // if l failed, p will be ignored, but both functions 
         // have been evaluated anyway 
+0

'return loginCheck()| passwordCheck();'在同一行中做同樣的事情,但在這種情況下,爲什麼你要做密碼檢查,如果登錄失敗是一個謎。 – EJP

+0

@EJP:是的,但後來又返回一個數字。我只是把它作爲複雜的'&='方式的替代品。 – pimvdb

+0

@EJP因爲我的支票編碼器UI。我想向用戶顯示當前錯誤 –

2

這是事情應該是這樣!

wikipedia

引用:所述邏輯與(又名&&)「導致真,如果兩個其操作數都爲真,假否則值」。
換句話說,如果第一個操作數爲假,則不需要繼續評估第二個操作數,因爲結果始終爲假。

所以像

if(condition1 && condition2) 

表達式相當於

if(condition1){ 
    if(condition2){ 

    } 
} 

所以你看,如果第一個條件是假的,就沒有必要繼續評估你的表現,因爲答案保持不變。