在將一個值賦給變量時,解析器必須確定這個值是基本類型值還是引用類型值。JavaScript有5種基本數據類型,Undefined、Null、Boolean、Number 和 String(詳情請看:JavaScript數據類型)。這5種基本數據類型是按值訪問的,因爲可以操作保存在變量中的實際值。
引用類型的值是保存在內存中的對象。與其他語言不同,JavaScript不允許訪問內存中的位置,也就是說不能直接操作對象的內存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。爲此,引用類型的值是按引用訪問的。
注意:在很多語言中,字符串以對象的形式來表示,因此被認爲是引用類型,JavaScript放棄了這一傳統。
下面的代碼,證明了字符串是基本類型:
- var strOriginal = "http://www.itxueyuan.org",
- strPass1 = strOriginal,
- strPass2 = strOriginal;
- strPass1 = "http://www.itxueyuan.org/javascript/";
- alert(
- "strPass1的值:" + strPass1 + "\n" +
- "strPass2的值:" + strPass2
- );
假如字符串是引用類型值,那麼 strPass1 和 strPass2 會指向同一段內存空間,更改 strPass1 的值,strPass2 的值也會隨之改變,但是實際情況並非如此,strPass1 和 strPass2 是互不影響的。這說明字符串是基本類型值。
再看下面一段代碼,證明了非空對象是引用類型:
- function ClassDemo(){
- this.name = "JavaScript中文網";
- this.url = "http://www.itxueyuan.org";
- }
- var objDemo = new ClassDemo(),
- objDemo1 = objDemo,
- objDemo2 = objDemo;
- objDemo1.url = "http://www.itxueyuan.org/javascript/";
- alert(
- "objDemo1.url的值:\n" + objDemo1.url + "\n" +
- "objDemo2.url的值:\n" + objDemo2.url
- );
假如對象是基本類型值,那麼改變 objDemo1.url 的值,不會影響到 objDemo2.url 的值,但是實際情況並非如此,改變 objDemo1.url 的同時,也改變了 objDemo2.url 的值,objDemo1 和 objDemo2 指向同一段內存空間。這說明,對象是引用類型值。