为什么基本类型可以调用方法——以字符串为例
引用類型中的基本包裝類型
對于str.substring(2)這種方法我們經常使用,
var str = "hello world";
var s1 = str.substring(2);?
可是str明明是個字符串(基本類型),又不是對象,為什么可以調用方法呢。。。。
解釋說明:
當我們用str這個字符串調用方法時,后臺已經為我們做了一系列操作,讓我們來看看究竟都做了哪些操作呢
當第二行代碼訪問str時,訪問過程處于一種讀取模式(即從內存中讀取這個字符串的值),而在讀取模式下訪問字符串時,后臺會做如下處理
a.創建String類型的一個實例
b.在實例上調用指定的方法
c.銷毀這個實例
針對此處代碼,可以想象是后臺進行了如下處理
var str = new String("hello world");
var s1 = str.substring(2);
str = null;?
到此就解釋了為什么字符串這個基本類型可以調用方法了。
———————————————分割線——————————————————
接下來我們了解下基本包裝類型,即用到的new String("hello world")
為了便于操作基本類型,ECMAScript提供了三個特殊的引用類型:Boolean、Number和String。
實際上,每當讀取一個基本類型的值時,后臺就會創建一個對應的基本包裝類型的對象,就如上面的例子所示。
引用類型和基本包裝類型的區別
主要是對象生存周期的不同
a.使用new創建的引用類型的實例,在執行流離開當前作用域之前都一直保存在內存中,
b.自動創建的包裝類型的對象只存在于一行代碼的執行瞬間,然后被立即銷毀
舉個栗子
var str = “hello world”;
str.color = "red";
alert(str.color);? //undefined
第二行代碼創建的String對象在執行第三行代碼時已經被銷毀,第三行代碼又創建了自己的String對象,而該對象沒有color屬性。
當然可以顯示的調用String、Boolean和Number來創建基本包裝類型的對象,但是再不是絕對必要的情況下不建議使用,這樣很容易讓人分不清楚是在處理基本類型還是引用類型的值。
Object構造函數也會像工廠方法一樣,根據傳入值的基本類型返回相應基本包裝類型的實例。例如
var obj = new Object("hello world");
alert(obj instanceof String ) ;? ?//true
需要注意的是:
使用new 調用基本包裝類型的構造函數,與直接調用同名的轉型函數是不一樣的
var value = “25”;
var number = Number(value);? ?//轉型函數
alert(typeof number);? ?// "number"
var obj = new Number(value);
alert( typeof obj );? ? // "object"
此處number中保存的是基本類型的值25
obj中保存的是Number的實例
?
——參考《javascript 高級程序設計》第五章的第六節的基本包裝類型
?
轉載于:https://www.cnblogs.com/xue6666/p/9174995.html
總結
以上是生活随笔為你收集整理的为什么基本类型可以调用方法——以字符串为例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: solr创建core
- 下一篇: 在做mvc时遇到的一些问题