JavaScript中的字符串、數字、布爾值不是對象

《JavaScript權威指南》(第六版)

字符串、數字、布爾值是有別於對象的。

但是,有人講,字符串既然不是對象,爲什麼它會有屬性和方法?對象不就是擁有屬性和方法的數據嗎?

其實,之所以出現這種說法,是因爲一個叫“包裝對象”的東西。存取字符串、數字或布爾值的屬性時,會臨時創建一個對象,這個對象在屬性引用結束後會自動銷燬。而字符串、數字和布爾值的屬性都是隻讀的,並且不能給他們定義屬性。

舉個栗子:

var s = "test"; //創建一個字符串
s.len = 4;      //設置一個新屬性
var t = s.len;  //查詢這個屬性可知,t值是undefined

當運行上面的代碼時,t的值是undefined。第二行代碼引用到了字符串s的屬性,JavaScript將字符串通過調用new String(s)的方式創建一個臨時對象,這個對象繼承了字符串的方法,被用來梳理屬性的引用,但該語句結束後該對象被銷燬。第三行通過原始的(沒有被修改過)字符串創建一個新字符串對象,嘗試讀取其len屬性,這個屬性自然不存在,表達式求值結果爲undefined。


需要注意的是,可通過String()、Number()或Boolean()構造函數來顯式創建包裝對象。例如:

var s = "test";          //一個字符串
var S = new String(s);   //一個字符串對象
JavaScript會在必要時將包裝對象轉換成原始值。“==”等於運算符將原始值和其包裝對象視爲相等,但"==="全等運算符將它們視爲不等。通過typeof運算符可以看到原始值和其包裝對象的不同。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章