JavaScript物件是一種複合值:它是屬性和已命名值的集合。透過"."符號來引用屬性值。當屬性值是函數時,稱為方法。
①一段你常用但卻未必明白其真正底層原理的程式碼:
var s = "hello world!"; var word = s.substring(s.indexOf(" ")+1,s.length);
如前面所說,這裡變數s只是一個字串原始類型,它怎麼會有屬性(s.length)和方法(s.indexOf()、s.substring())呢?沒錯,這正跟我們正要介紹的包裝對像有關。原因是:只要引用了字串s的屬性,JavaScript就會將字串值透過呼叫new String(s)的方式轉換成對象,這個物件繼承了字串(String)物件的方法,並用來處理屬性的引用。一旦屬性引用結束,這個新建立的物件就會被銷毀。
同字串一樣,數字和布林值也有各自的方法:透過Number()和Boolean()建構子建立一個臨時物件。存取字串、數字或布林值的屬性時所建立的臨時物件就是包裝物件。 5種原始類型中的剩餘兩種null和undefined沒有包裝物件:存取它們的屬性會造成一個類型錯誤(Uncaught TypeError)。明白了上面的程式碼,那就再看如下碼:
var s = "test"; s.len = 4;//给它设置一个属性 var t = s.len;
不認真的同學這裡就會認為最後t就是等於4了。難道最後t不等於4嗎?是的,最後t的值是undefined。想知道為什麼請看繼續看解析:原來以這裡第二行程式碼只是創建了一個臨時字串對象,並給len屬性賦值為4,隨即銷毀這個對象。而第三行又是透過原始字串s建立一個新字串物件(這個不是第二行程式碼所建立的對象,第二行程式碼所建立的物件已經被銷毀了)並嘗試讀取其len屬相,這個屬性自然不存在,因此表達式的結果為undefined。這段程式碼說明了在讀取字串、數字和布林值的屬性值或方法(實際上是它們對應包裝物件的屬性值或方法)表現的像物件一樣。但如果你試圖將屬性賦值,則會忽略這個操作:修改只是發生在臨時物件身上,而這個臨時物件並不會繼續保留下來。
注意:可透過String(),Number(),Boolean()建構子來顯示建立包裝物件:
var s = "test",n=1,b=true;//一个字符串、数字和布尔值 var S = new String(s);//一个字符串对象 var N = new Number(n);//一个数值对象 var B = new Boolean(b);//一个布尔对象
JavaScript會在必要時將包裝物件轉換成原始值,因此上段程式碼中的物件S、N和B常常但不總是表現的和值s、n和b一樣。 "=="等於運算子將原始值和其包裝物件視為相等,但「===」全等運算將它們視為不等。透過typeof運算子也可以看到原始值和其包裝物件的不同:
①typeof(s); ->"string" typeof(S); ->"object" ②typeof(n); ->"string" typeof(N); ->"object" ③typeof(b); ->"string" typeof(B); ->"object"
以上所述就是本文的全部內容了,希望大家能夠喜歡。