JavaScript 是一種可以在瀏覽器中運(yùn)行的腳本語言,,是一種弱語言(相對于C,,C#,JAVA而言),,只要是計算機(jī)語言就會使用到條件判斷式,,而JavaScript作為一種“弱”語言,它的條件判斷常常令人困惑不解,,特別是有其它強(qiáng)語言編程經(jīng)歷的人來說,,更是不可理喻!高手和無惑的人別取笑,,我自己也曾經(jīng)有一段時間郁悶過,。先寫一個例子吧: var s = "meizz"; 咱先不管上面的代碼運(yùn)行的結(jié)果正確與否,我給變量 s 賦的是字符型,,而在后面的 if 條件判斷式里是直接把變量 s 作為一個判斷表達(dá)式寫出的,,若是在強(qiáng)語言里對字符型的變量要么是判斷它的類型是否是字符型或者是判斷這個變量的值是否等于某字符串,但在 javascript 里就是沒有用類型判斷(typeof)也沒有值判斷(==)而就是這么孤伶伶地在那里,,就可以作為一個條件判斷表達(dá)式,。當(dāng)然這種單獨(dú)作為條件表達(dá)式不只是字符型變量,也可以是數(shù)字型變量,,也可以是一個對象,,也可以是一個函數(shù)或者方法等等。這就正是這種語法令人費(fèi)解的地方,。 我測試統(tǒng)計了一下:在 JavaScript 里,,不為空 "" 的字符串,、不為 0 的數(shù)字、不為 null 的對象,、不為 undefined 的對象屬性,、布爾型 true,單獨(dú)作為判斷式里的一個表達(dá)式時 JavaScript 通通認(rèn)定為真(true),,反之則為假(false),。 原因為是JS腳本沒有強(qiáng)變量類型,你前一句賦值 var s = "meizz"; 后一句你甚至馬上可以寫成 s = function(){}; ,,中間沒有任何的類型轉(zhuǎn)換,,而這些寫法在強(qiáng)語言里是不可思議的,甚至是大逆不道的(根本就不支持這種語法),,但在JS腳本里卻是那么的自然,。原因就是沒有強(qiáng)制變量類型, 變量類型是動態(tài)的,,也就是說變量本身是沒有類型的,,變量的值是有類型的。呵呵,,這里扯到其它模塊去了,,嗯,關(guān)于變量類型我另外再寫文章討論吧,。 說到這里,,就不難理解 if (s && .....這句的判斷式了,同樣的道理,,我甚至可以 function s(){} 然后再用 if (s && .... 或者 var s = document.getElementById("ObjectId"); if (s && .... 這樣語法在JS腳本里都是沒錯的,,至于判斷的結(jié)果可以參考上面的那段統(tǒng)計結(jié)果。 現(xiàn)在再來討論上面的那幾句代碼的運(yùn)行結(jié)果,,多個條件判斷式的結(jié)果合成運(yùn)行只有“與”和“或”,,到于“非”因為它是一元運(yùn)行符,只針對單個值,,比如 if (!s) ... 至于條件式不只一個的時候條件式的結(jié)果只有與和或的運(yùn)行,。與(&&),,或(||),。上面的那句條件式:if (s && s==true) 就是兩個條件式的合成判斷。至于與運(yùn)算(只要一個值為false則值為false)或運(yùn)算(只要一個值為true則值為true)這些運(yùn)算細(xì)節(jié)我就不多說了,,教科書比我的筆頭強(qiáng)多了?,F(xiàn)在來分析這個判斷式:這是一個“與”運(yùn)算。第一個判斷式 s ,,因為它的字符型值不為 "" ,,在JS當(dāng)然認(rèn)為它等同于 true,,第二個判斷式是 s==true,顯然這個不相等,,值為 false,,因為是“與”運(yùn)算,當(dāng)然整個條件判斷式的結(jié)果是 false,,所以不會運(yùn)行 alert(),。 第三,我這里說說幾個很特殊的條件判斷,。在沒有任何聲明(var)和賦值的情況下,,直接拿一個變量來判斷JS會拋出一個變量未定義的錯誤出來。比如: if (ss) alert("條件判斷結(jié)果為 true,!"); 運(yùn)行這句代碼就會出錯,。因為這個變量 ss 從未被聲明賦值過,這種情況不等同于上述的 null "" undefined,。這種情況一般會發(fā)生在什么地方呢,?一是自己寫代碼不小心未聲明,二就是對網(wǎng)頁里沒有的控件進(jìn)行操作直接用ID來操作的時候,,比如 if (InputId.value!="") ... ,,若是網(wǎng)頁里根本就沒有 id="InputId" 的文本框或者在執(zhí)行這句腳本操作的時候這個文本框還沒有被瀏覽器加載,那也就拋出變量未定義的錯誤,。 結(jié)果的辦法是:第一種情況用 typeof 判斷,。if (typeof(ss)=="undefined") alert("變量未定義"); ,第二種情況則不要直接使用ID來引用對象而使用標(biāo)準(zhǔn)的對象引用,。例: var e = document.getElementById("InputId"); //IE里以前是用 document.all.InputId 這樣就不會出這種錯誤了,。 那么就上面這句代碼有人會說一定要這樣寫呢,為什么不直接 if(document.getElementById("InputId").value != "") ;//.... 這樣的代碼不是更精練嗎,?城然代碼是精簡了,,但錯誤也來了。只要網(wǎng)頁里沒有這個對象或者這個對象在腳本執(zhí)行的時候還未被加載到,,就會報錯,。原來是 document.getElementById("InputId") 返回了 null 值,而 null 顯然是沒有 value 屬性的,,而我那句代碼也用到了 e.value 來取屬性但就沒有報錯,,原因在于C系列的語言在多個條件式里的另一外屬性:多個條件判斷式組合判斷時,先看第一個條件式,,若已經(jīng)符合條件時,,就不會再去判斷第二個判斷式;也就是在第一個條件判斷式未達(dá)到標(biāo)準(zhǔn)時再會去判斷第二個判斷式,,依此類推直至最后,。if (e && e.value!="") 是兩個判斷式的組合判斷,,這是一個“與”運(yùn)算,只要一個判斷式為 false 則整個值都為 false,。第一個判斷式 e 由于不存在或者未加載到返回了 null,,而在JS里 null 就等同于 false ,這樣不用后面的判斷也可得到整個組合判斷的結(jié)果是 false 了,,所以系統(tǒng)就不會再去判斷后面的那句 e.value 了,。這點與B系列語言不同,尤其要注意,。在B語言中 if e and e.value!="" then 這樣的語句是先把所有的判斷式都運(yùn)算一遍后最后再做組合的“與”運(yùn)算,。所以這句代碼在JS里是正確的,若放在VBS里就不一定正確了,。 |
|