2012-04-17 122 views
3

有什麼區別:if((typeof OA != 'undefined') && OA)if(OA)區別:if((typeof OA!='undefined')&& OA)和if(OA)

以前的聲明有效;後者悄悄停止當前函數的執行。

(也許是一個菜鳥問題)

謝謝!

+2

你能提供一些更多的上下文嗎?這兩個語句本質上是相同的,但如果沒有聲明「OA」(即'var OA;'),則第二個語句將失敗。你永遠不應該處於第二種情況,總是聲明變量(如果它們不是函數參數的名稱)。 – 2012-04-17 17:12:58

+1

@FelixKling:我認爲這是問題。 – 2012-04-17 17:13:49

+1

@火箭:可能......它只是看起來很奇怪...猜我還沒有看到這樣的代碼在一段時間;)使用JSHint真的也有幫助... – 2012-04-17 17:14:49

回答

4

if(OA)將會失敗如果OA從未定義。 typeof OA != 'undefined'檢查是否定義了OA

var OA; 
if(OA){ 
} 

This works。

if(OA){ 
} 

這是行不通的:OA is not defined

typeof OA != 'undefined' && OA檢查,如果它試圖訪問變量

+1

+1,可能值得注意的是'undefined'是false-y,你的第一個例子不檢查'null',它檢查'undefined'。人們似乎感到困惑。未定義的類型與「未定義」類型不同。 – Marc 2012-04-17 17:16:32

0

編譯器之前定義不會嘗試評估OA櫃面地方在它試圖如果(OA)

0
if ((typeof OA != 'undefined') && OA) 

這將首先評估在使用typeof檢查是否定義了變量OA。如果是,它將被轉換爲布爾值並進行評估。

if(OA) 

這是假設OA存在,並立即把它強制轉換爲布爾值,並評估它。

第二個示例將拋出javascript異常,如果變量OA從未聲明 - 第一個示例可以避免這種情況。

有關JavaScript中undefined的多重含義的更多說明,請參閱my answer here

+0

用try {} catch(){}進行了雙重檢查:ReferenceError:OA沒有定義。 因此,可能導致運行時異常的「未定義」不是「未定義」,在布爾運算中被視爲虛假。顯然我是一名新秀,但爲什麼會有微妙的差異? – user1279175 2012-04-17 19:21:27

+0

http://stackoverflow.com/questions/10098816/is-variable-set-defined-issue/10099267#10099267 – jbabey 2012-04-17 19:22:12

相關問題