js中的boolean原始型別和Boolean引用型別
js 程式碼
- var bFound = true;
- var bFlag = false;
如上面的兩行程式碼,boolean型別是JavaScript中的一種原始型別,它只有兩種值:true和false。
使用Boolean(value)方法可以強制轉換任意值為boolean型別
- alert(Boolean('')); //outpt false
- alert(Boolean('hello')); //output true
- alert(Boolean(100)); //output true
- alert(Boolean(0)); //output false
- alert(Boolean(NaN)); //output false
- alert(Boolean(null)); //output false
- alert(Boolean(undefined)); //output false
- alert(Boolean(new Object())); //output true
可以看出,當被轉換的值為空字串、數字0和NaN、null或者undefined時,轉換為false,其它情況轉換為true。所以當我們寫if判斷的時候需要注意這些特殊的情況,尤其是使用目前比較流行的“物件探測法”書寫JS時。
“物件探測法”主要寫法如下:
- var student = new Object();
- if (student.name) {
- alert(student.name);
- } else {
- student.name = 'Tom';
- alert(student.name);
- }
if (student.name)這句用來探測student物件中存不存在name屬性,如果存在則彈出;否則把name賦值為'Tom',再彈出。這邊需要注意的是如果name值已經存在,並且值為空字串或者0時,結果可能與你預期的不同。
在JavaScript中除了存在boolean型別這樣的原始型別之外,還存在一種引用型別 -- Boolean型別。建立Boolean型別的物件的程式碼如下:
- var
需要注意的是這邊的"new Boolean()"與前面的"Boolean()"的區別,前者是建立Boolean物件,後者為強制型別轉換方法。不過,在大多數情況下Boolean型別是不常被用到的。並且在使用Boolean型別的時候還可能產生一些誤會,看看下面的程式碼:
js 程式碼- var oBooleanFalse = new Boolean(false);
- alert(oBooleanFalse && true); //output true
這邊輸出是true,讓人覺得奇怪。當執行oBooleanFalse && true時,oBooleanFalse被強制型別轉換了,而這邊oBooleanFalse是一個Object,強制轉換後為true。也就說這邊用來計算的是oBooleanFalse物件本身,而不是它的值false。
雖然我們需要了解Boolean這種型別,但為了避免錯誤,最好還是使用boolean原始型別。
再看下面一個例子:
- var ob1 = new Boolean(false);
- var ob2 = (ob1&&true);
- var ob3 = (true&&ob1);
- var ob4 = Boolean(ob1&&true);
- var ob5 = Boolean(true&&ob1);
- alert("ob2 = " + ob2 + ", ob3 = " + ob3 + ", ob4 = " + ob4 + ", ob5 = " + ob5);
- //output ob2 = true, ob3 = false, ob4 = true, ob5 = true
這邊最讓人困惑的就是ob2和ob3由於順序上的不同,最終的結果居然不同。產生這樣的結果主要和JavaScript中的邏輯運算子的工作方式相關。具體工作方式如下:
1. && 的工作方式:從第一個開始,遇到值為false的表示式(fasle、null、undefined、0、NaN、‘’)則返回此表示式,否則返回最後一個表示式(注意,這邊所說的表示式不一定為boolean型別)
2. || 的工作方式:從第一個開始,遇到值為true的表示式(與上面&&相反的其他情況)的返回此表示式,否則返回最後一個表示式
3. ! 的工作方式:對錶達式的值取非(注意不是對錶達式)。
回到上面的例子,我們可以知道,對於var ob2 = (ob1&&true);,首先看ob1表示式強制轉換為boolean型別後的值,這邊ob1為Boolean引用型別,從前文可知強制轉換後值為true。邏輯運算(ob1&&true)會繼續看下一個值true。這時,邏輯運算&&發現這已經是最後一個值,所以返回了最後的這個表示式true。最終我們的ob2 = true。
對於var ob3 = (true&&ob1);,首先第一個表示式是true,接著看第二個表示式ob1,由於這已經是最後一個表示式了,所以返回ob1。最終ob3 = ob1 = new Boolean(false);即ob3是一個Boolean引用型別。
最後,在alert語句中,使用"ob3 = " + ob3時,預設會呼叫ob3的toString()方法,而Boolean型別的toString方法即是輸出它自己的內部值。這邊ob3的內部值為false。瞭解到這樣的特性後,對於ob4和ob5的結果也就不難理解了。
JavaScript 中 if() 圓括號中的表示式將被看做布林值來處理.
總之:
1.特殊值undefined和null變成false.
2.數字0和NaN變成false.
3.空字串變成false.
4.所有其他值都變成true.