javascript代碼運(yùn)行的過程中基本類型會找到對應(yīng)的包裝對象,然后包裝對象把所有的屬性和方法給了基本類型,然后包裝對象被系統(tǒng)進(jìn)行銷毀,所以理解了包裝對象可以很好的理解之前寫的代碼為什么可以這樣做了。
JavaScript對象是一種復(fù)合值:它是屬性和已命名值的集合。通過"."符號來引用屬性值。當(dāng)屬性值是一個函數(shù)時,稱為方法。
①一段你常用但卻未必明白其真正底層原理的代碼:
- var s = "hello world!";
- var word = s.substring(s.indexOf(" ")+1,s.length);
如前面所說,這里變量s只是一個字符串原始類型,它怎么會有屬性(s.length)和方法(s.indexOf()、s.substring())呢?沒錯,這正跟我們正要介紹的包裝對象有關(guān)。原因是:只要引用了字符串s的屬性,JavaScript就會將字符串值通過調(diào)用new String(s)的方式轉(zhuǎn)換成對象,這個對象繼承了字符串(String)對象的方法,并被用來處理屬性的引用。一旦屬性引用結(jié)束,這個新創(chuàng)建的對象就會被銷毀。
同字符串一樣,數(shù)字和布爾值也有各自的方法:通過Number()和Boolean()構(gòu)造函數(shù)創(chuàng)建一個臨時對象。存取字符串、數(shù)字或布爾值的屬性時創(chuàng)建的臨時對象就是包裝對象。5種原始類型中的剩余兩種null和undefined沒有包裝對象:訪問它們的屬性會造成一個類型錯誤(Uncaught TypeError)。明白了上面的代碼,那么再看如下代碼:
- var s = "test";
- s.len = 4;//給它設(shè)置一個屬性
- var t = s.len;
不認(rèn)真的同學(xué)這里就會認(rèn)為最后t就是等于4了。難道最后t不等于4嗎?是的,最后t的值是undefined。想知道為什么請看繼續(xù)看解析:原來以這里第二行代碼只是創(chuàng)建了一個臨時字符串對象,并給len屬性賦值為4,隨即銷毀這個對象。而第三行又是通過原始字符串s創(chuàng)建一個新字符串對象(這個不是第二行代碼創(chuàng)建的對象,第二行代碼創(chuàng)建的對象已經(jīng)被銷毀了)并嘗試讀取其len屬相,這個屬性自然不存在,因此表達(dá)式的結(jié)果為undefined。這段代碼說明了在讀取字符串、數(shù)字和布爾值的屬性值或方法(實(shí)際上是它們對應(yīng)包裝對象的屬性值或方法)表現(xiàn)的像對象一樣。但如果你試圖給屬性賦值,則會忽略這個操作:修改只是發(fā)生在臨時對象身上,而這個臨時對象并不會繼續(xù)保留下來。
注意:可通過String(),Number(),Boolean()構(gòu)造函數(shù)來顯示創(chuàng)建包裝對象:
- var s = "test",n=1,b=true;//一個字符串、數(shù)字和布爾值
- var S = new String(s);//一個字符串對象
- var N = new Number(n);//一個數(shù)值對象
- var B = new Boolean(b);//一個布爾對象
JavaScript會在必要時將包裝對象轉(zhuǎn)換成原始值,因此上段代碼中的對象S、N和B常常但不總是表現(xiàn)的和值s、n和b一樣。"=="等于運(yùn)算符將原始值和其包裝對象視為相等,但“===”全等運(yùn)算將它們視為不等。通過typeof運(yùn)算符也可以看到原始值和其包裝對象的不同:
- ①typeof(s); ->"string"
- typeof(S); ->"object"
- ②typeof(n); ->"string"
- typeof(N); ->"object"
- ③typeof(b); ->"string"
- typeof(B); ->"object"
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
新聞熱點(diǎn)
疑難解答
圖片精選