標籤:
網上非常多都在說”JavaScript一切皆對象“,那麼這個"一切"到底是實實在在的"一切",還是一個虛數?也有看過網上的文章,有的三紙無驢,就是抄抄概念,有的也只是解釋了一部分,並沒有給出確切的結論。那麼我想結合自己的理解,給出一個確切的結論。
當然,結論嘛,自然要放在文章結尾。小夥伴們接著往下看。 資料類型概要進入之前,有必要概要地說一下js的資料類型,當然小夥伴們也可以直接pass。js的資料類型有兩種:原始類型和物件類型。其中原始類型又包括以下幾種類型:數字型、字串型、布爾值、null和undefined。其中物件類型包括使用者通過各種方法自己建立的對象和一些函數數組啊之類的特殊對象。 原始值原始值不可修改說到了原始值,就有必要再簡單聊一下原始值的一些東西。 首先給出個結論: 原始值是不可以修改的,是什麼就是什麼,就算強迫也強迫不來(這是倔強呢)。數字、布爾值、null、undefined很顯然是不能修改的,5就是5,它不能是6,但是對於字串可能有些小夥伴會有疑惑:字串怎麼不能修改啊,那麼多的字串方法都可以修改字串呢。為瞭解釋,還是先來個熱乎乎的例子爽一下。 var string=‘The handsome have five girlfriend.‘;string.toUpperCase();我們定義了一個“帥哥有五個女朋友”的字串(其實屌絲也有五姑娘啊,the diors have five girlfriend啊),然後調用了toUpperCase()方法將字串轉為大寫。我們輸出一下: alert(‘原來的字串是:‘ + string + ‘修改後的字串是:‘ + string.toUpperCase());OK,輸出結果是這樣的: 原來的字串是:The handsome have five girlfriend. 修改後的字串是:THE HANDSOME HAVE VIFE GIRLFRIEND.看到這裡,一切都赤裸裸了: 看上去字串的方法返回了修改後了的字串,實際上是返回了一個新的字串,即是兩個字串,糟糠之妻還在榻上(其他的方法小夥伴也可以試試)。 那麼,聊到這裡,可以看到原始值確實不可以修改的,即原始值是不可變的。 原始值是對象嗎接下來,我們切入正題:原始值到底是不是對象? 首先,物件類型自然是對象,至於原因嘛,就是“證明我媽是我媽”。至於原始類型是否為對象,我們先上字串類型來說明。 照舊先來個新鮮出爐的血淋淋的例子: var string=‘Make Life Get Better‘;//這不是MLGB嗎!!!!!!!!!alert(string.length);這個MLGB是個字串,按理來說不應該像對象一樣有屬性啊,但是事實呢?我們再看下這新鮮出爐的血淋淋的輸出: 20結果是這個原始值字串確實使用了字串對象才有的length屬性,輸出了string字串的長度。 ok,而正是因為這樣我們才有理由把字串類型看成對象。那這是為什麼呢?這裡就涉及到了封裝對象的概念。 封裝對象其實在上面的例子中在讀取字串的時候會建立一個對象,但是這個對象只是臨時的,所以我們稱它為臨時對象,學術名字叫封裝對象。說它臨時,是因為我們在讀取它的屬性的時候,js會把這個string字串通過new String()方式建立一個字串對象,有了對象自然就有了屬性,但是這個對象只是臨時的,一旦引用結束,這個對象就被銷毀了。 然後再引用《JavaScript權威指南》裡面的一句話補充一下: 其實(封裝對象)在實現上並不一定建立或銷毀這個臨時對象,然而整個過程看起來是這樣的。 同理,數字、布爾值在讀取屬性的時候也可以通過自己的建構函式來建立自己的一個臨時對象,並像對象一樣(就是一個對象)引用各自的屬性,所以,字串、數字、布爾值都可以看成是對象,注意,這裡是看成對象,他們並不是真正的對象,也就是嚴格來說,它們並不是對象,因為對象是可變的,可以修改屬性,而原始值是不可變的是不可修改的(看上面),但是他們的封裝對象和對象是非常相似的,可以讀取封裝對象的屬性,所以我們只是說成,可以看成對象。 但是請注意一點: 因為建立的只是一個臨時對象,寫的屬性只存在於臨時對象上,引用完後隨即銷毀,寫的屬性自然也煙消雲散,皮之不存,毛將焉附就是這個道理。建立的臨時對象只可以讀屬性,不可以寫屬性。感興趣的可以賦一個屬性,然後讀取該屬性看看。為了給大家節省幾個位元組的流量,例子就不在這兒寫了。 null&undefined那null和undefined呢?我們接著摸。 首先是null,null是一個關鍵字,表示“空值”,我們對null執行typeof操作,輸出結果是object,所以我們可以把null看成一個特殊的對象,這個對象表示一個“Null 物件”(突然想到了白馬非馬論),即便是一個“Null 物件”,它也是一個對象。這個小夥伴們可以理解一下。 然後是undefined,undefined是另一個表示“空值”特殊值,它表示未定義,當我們對變數只聲明沒有初始化時,輸出為undefined,當我們引用一個不存在的屬性時,輸出也為undefined,小夥伴們可以自行驗證,但是請注意它並不是一個關鍵字,它是一個變數,而且是一個全域變數,我們可以驗證一下: alert(undefined in window)輸出為: true結果證明undefined確實是一個全域變數。 同樣,我們用typeof來看一下undefined的類型,輸出為undefined。這嚴格表明undefined是這個類型的唯一成員,順帶提一句,null的typeof雖然是object,但是認為null是它自有類型的唯一成員。但是undefined並沒有封裝對象,typeof類型也不是object,和對象並沒有沾親帶故的關係,所以我並不把它看成是對象。 小了個結當然,以上只是簡單的解釋,如果往深處挖水還很多(是不是說水還很深合適一些。。。),但是可以簡單的來一個結論:除了undefined,JavaScript的一切都是對象或者可以看成對象。當然,這隻是一家之言,也歡迎小夥伴們分享自己的理解。我去,到點了,該睡午覺了。沙揚娜拉。
JavaScript“並非”一切皆對象