《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運算符可以看到原始值和其包裝對象的不同。