|
在JScript的眾多運(yùn)算符里,提供了三個(gè)邏輯運(yùn)算符&&、||和!,噢?! 是高級(jí)語言都提供的。按我們對(duì)邏輯運(yùn)算的正常認(rèn)識(shí),邏輯運(yùn)算的結(jié)果因該是ture或者false。但是JScript的邏輯運(yùn)算卻不完全是這么定義的,這里只有!運(yùn)算符總是返回true|false,而||和&&運(yùn)算比較的好玩。
JScript對(duì)于邏輯運(yùn)算的true|false是這么定義的:
可是邏輯運(yùn)算符||和&&雖然遵循上面的定義規(guī)則,但是它們返回的值卻很有意思。
對(duì)于&&運(yùn)算,按照上面的規(guī)則,表達(dá)式 if ( 'abc' && '123' && new Date() ) 是執(zhí)行true分支,可是這個(gè)表達(dá)式如果寫成:
結(jié)果value=Fri Jan 21 00:01:17 UTC+0800 2005,原它從左到右檢測(cè),如果到了最后一個(gè)表達(dá)式也是為true的,就返回那個(gè)表達(dá)式。
對(duì)于||運(yùn)算同理,對(duì)于下面的表達(dá)式:
結(jié)果value1='abc',value2='ok'。這是因?yàn)閨|運(yùn)算會(huì)有"短路"特性,他也是從左向右檢測(cè),只不過它是一但發(fā)現(xiàn)有為true的值,就立即返回該表達(dá)式。
這樣的特性可以幫組我們寫出精簡(jiǎn)的代碼,可是同時(shí)也帶來代碼不便于閱讀維護(hù)的問題。
由于我手頭暫時(shí)沒有NS和moz什么的瀏覽器,不知道標(biāo)準(zhǔn)JavaScript是否也是這樣支持的?如果您方便的話,請(qǐng)告如我運(yùn)行后的結(jié)果
有時(shí)你可能需要對(duì)變量進(jìn)行類型檢查,或者判斷變量是否已定義。有兩種方法可以使用:typeof函數(shù)與constructor屬性。
typeof函數(shù)的用法可能不用我多說,大家都知道怎么用。而constructor屬性大家可能就陌生點(diǎn)。在《精通JavaScript》這本書中有提到construct的用法,但我用自己的幾個(gè)瀏覽器(IE7.0 / Firefox1.9 / Opera9.50)測(cè)試的結(jié)果卻和書上說的不一樣。但是仍然是有辦法通過constructor屬性來檢查變量類型的。
這里先補(bǔ)充一下,為什么明明有typeof函數(shù)可以很方便地用來檢測(cè)類型,還要用constructor呢?
因?yàn)閠ypeof會(huì)把所有的數(shù)組類型以及用戶自定義類型判斷為object,從而無法知道更確切的信息。而constructor卻可以解決這個(gè)問題。
ok,明白了我們?yōu)槭裁匆胏onstructor,現(xiàn)在讓我?guī)Т蠹乙徊讲秸J(rèn)識(shí)一下typeof和constructor用法之間的差異吧~
首先我們運(yùn)行一下下面這段代碼:
這3行代碼告訴你什么情況下可以用constructor。
你可以看到第2行返回了字符串'undefined',而第三行則發(fā)生了錯(cuò)誤,原因是i變量還沒有類型定義,自然也沒有constructor的存在。
從這一點(diǎn)上看,typeof可以檢查到變量是否有定義,而construct只能檢查已定義變量的類型。
再運(yùn)行一下下面這段代碼:
你會(huì)看到第2行返回了字符串'number’,第3行返回了一串類似函數(shù)定義的代碼字符串(這就是跟《精通JavaScript》一書中介紹的不一樣的地方)。
我們?cè)儆胻ypeof檢查一下constructor到底是個(gè)什么樣類型的屬性,第4行返回結(jié)果'function',也就是說,實(shí)際上constructor是一個(gè)函數(shù),更確切地說是一個(gè)構(gòu)造函數(shù)。這時(shí)你就可以知道,為什么constructor可以檢查出各種類型了。
有經(jīng)驗(yàn)的程序員看到這里應(yīng)該知道要怎么利用constructor來檢查變量類型了。方法有多種,這里提供一種比較容易理解的方法。
其實(shí)想法很簡(jiǎn)單,就是把construcor轉(zhuǎn)化為字符串,通過尋找匹配字符串(function名)來確定是否指定類型。如下例子:
這僅僅是個(gè)簡(jiǎn)單的例子。如果返回true則變量i不是user類型,返回false則變量是user類型。
當(dāng)然,這樣檢測(cè)是不夠精確的,比如其實(shí)他是一個(gè)myuser類型的時(shí)候,同樣會(huì)被認(rèn)為是user類。所以你需要書寫更精確的正則表達(dá)式去進(jìn)行匹配。
可以這樣簡(jiǎn)單改進(jìn)你的正則表達(dá)式:
替換上面代碼段中的/user/。當(dāng)然,如果你的構(gòu)造函數(shù)原型是user(a),那么應(yīng)該這樣書寫你的正則表達(dá)式:
到這里你應(yīng)該知道怎樣使用constructor類型去檢查變量類型了吧?
ok,最后再提個(gè)醒,如果你要用基于constructor的方法去檢查一些基本類型,如
Object / Array / Function / String / Number / Boolean
在你的正則表達(dá)式中,一定要將這些單詞的首字母大寫!!而如果該類型是自定義類型,則根據(jù)你定義的時(shí)候標(biāo)識(shí)符的寫法確定。