1. 程式人生 > 實用技巧 >一篇文章讓你玩轉js中的Boolean

一篇文章讓你玩轉js中的Boolean

前言

這篇文章帶大家來回顧一下,基本型別布林型和為什麼布林型別是基本資料型別卻可以呼叫一些屬性和方法,本文主要參考了《JavaScript高階程式設計》,如有不對之處歡迎指正

正文

基本資料型別Boolean

Boolean型別是ECMAScript中使用得最多的一種型別,該型別只有兩個字面值:true和false。且這兩個字面量值不一定等於數字中的1或0,Boolean型別的字面值true和false是區分大小寫的。也就是說,True和False(以及其他的混合大小寫形式)都不是Boolean值,只是識別符號。

ES中所有的資料型別都有與Boolean型別等價的值,要看他們等價於true還是false,可以呼叫轉型函式Boolean(),注意這個函式任何資料型別都可以使用,下面是一些轉換規則:

資料型別 可以轉換為true的值 可以轉換為false的值
Boolean true false
String 非空字串 空字串
Number 任何非零數字(包括無窮大) 0和NaN
Object 任何物件(請牢記,下面會提到) null
undefined 不使用 undefined
與基本資料型別對應的基本包裝型別物件

講到這裡,我要在引申一下即基本資料型別Boolean對應的基本包裝型別物件Boolean,其中還有(String,Number),正是有了這些基本包裝型別的物件,我們才能在Number,String這些基本資料型別上使用一些屬性和方法(基本型別值不是物件,因而從邏輯上講它們不應該有方法),每當讀取一個基本型別值的時候,後臺就會建立一個對應的基本包裝型別的物件,從而讓我們能夠呼叫一些方法來操作這些資料。

每當讀取一個基本資料型別時,後臺都會自動完成下列處理。

(1) 建立String型別的一個例項;

(2) 在例項上呼叫指定的方法;

(3) 銷燬這個例項。

例如:

var s1 = "some text";
var s2 = s1.substring(2);

在後臺實際經歷瞭如下步驟:

var s1 = new String('some text');
var s2 = s1.substring(2);
s1 = null;

引用型別與基本包裝型別的主要區別就是物件的生存期。使用new操作符建立的引用型別的例項,在執行流離開當前作用域之前都一直儲存在記憶體中。而自動建立的基本包裝型別的物件,則只存在於一行程式碼的執行瞬間,然後立即被銷燬。這意味著我們不能在執行時為基本型別值新增屬性和方法。

當然,可以顯式地呼叫Boolean、Number和String來建立基本包裝型別的物件。不過,應該在絕對必要的情況下再這樣做,因為這種做法很容易讓人分不清自己是在處理基本型別還是引用型別的值。對基本包裝型別的例項呼叫typeof會返回"object",而且所有基本包裝型別的物件在轉換為布林型別時值都是true。(對應表中的轉換規則)。

Object建構函式也會像工廠方法一樣,根據傳入值的型別返回相應基本包裝型別的例項。

var a = new Object('string'); // a會是一個Sting的例項
var b = new Object(2); // 會是一個Number的例項
var b = new Object(true); // 會是一個Boolean的例項
Boolean基本包裝資料型別

Boolean物件在ECMAScript中的用處不大,因為它經常會造成人們的誤解。其中最常見的問題就是在布林表示式中使用Boolean物件,但是理解基本型別的布林值與Boolean物件之間的區別非常重要,看下面的例子

 var falseObject = new Boolean(false);
 var result = falseObject && true;
 console.log(result); //true
var falseValue = false;
result = falseValue && true;
console.log(result); // false

我們使用false值建立了一個Boolean物件。然後,將這個物件與基本型別值true構成了邏輯與表示式。在布林運算中,false && true等於false。可是,示例中的這行程式碼是對falseObject而不是對它的值(false)進行求值。前面討論過,布林表示式中的所有物件都會被轉換為true,因此falseObject物件在布林表示式中代表的是true。結果,true && true當然就等於true了。

基本型別與引用型別的布林值還有兩個區別。首先,typeof操作符對基本型別返回"boolean",而對引用型別返回"object"。其次,由於Boolean物件是Boolean型別的例項,所以使用instanceof操作符測試Boolean物件會返回true,而測試基本型別的布林值則返回false。