1.基本類型和應用類型的值 ECMAScript變數可能包含兩種不同數據類型的值: 基本類型值——簡單的數據段。(5種基本的數據類型,按值訪問,因為可以操作保存在變數中的實際的值。) 引用類型值——多個值構成的對象。(引用類型的值是保存在記憶體中的對象。) 註意: javascript不允許直接訪問內 ...
1.基本類型和應用類型的值
ECMAScript變數可能包含兩種不同數據類型的值:
基本類型值——簡單的數據段。(5種基本的數據類型,按值訪問,因為可以操作保存在變數中的實際的值。)
引用類型值——多個值構成的對象。(引用類型的值是保存在記憶體中的對象。)
註意:
javascript不允許直接訪問記憶體中的位置,也就是不能直接操作對象的記憶體空間。在操作對象時,實際上是操作對象的引用,引用類型的值是按引用訪問的。
說明:
其實上面這種說法不嚴謹,但複製保存著對象時,操作的是對象的引用。但是為對象添加屬性時,操作的是對象。
另:在很多語言中,字元串以對象來表示,因此被認為是引用類型的。ECMAScript放棄了這一傳統。
(1)可以為引用類型的值動態地添加屬性
eg:
1 var person=new Object(); //註意,Object的第一個字母為大寫,如果小寫會出現錯誤。 2 person.name="Linshuling"; 3 alert(person.name); 4 </script>
(2)複製變數值
複製基本類型的值:
eg:var num1=5;
var num2=num1;
如上的例子,num1和num2是完全獨立的,雖然它們的值都為5。
複製引用類型的值:
eg:
1 var obj1=new Object(); 2 var obj2=obj1; 3 obj1.name="Linshuling"; 4 alert(obj2.name);
如上,當一個變數向另一個變數複製引用類型的值是,同樣也會將變數對象中的值複製一份放到位新變數分配的空間中。不同的是,這個值的副本實際上是一個指針,而這個指針指向存儲在堆中的一個對象。複製操作結束後,兩個變數實際上將引用同一對象。因此,改變其中一個變數,就會影響另一個變數。
(3)傳遞參數
ECMAScript中所用函數的參數都是按值傳遞的。(訪問變數有按值和按引用兩種,而參數只能按值傳遞。)
以下兩個例子體會使用對象類型值的按值傳遞:
eg:
1 function setName(obj){ 2 obj.name="Linshuling"; 3 } 4 var person=new Object(); 5 setName(person); 6 alert(person.name);
1 function setName(obj){ 2 obj.name="Linshuling"; 3 obj=new Object(); 4 obj.name="lin"; 5 } 6 var person=new Object(); 7 setName(person); 8 alert(person.name);
(4)檢測類型
用typeof操作符可以檢測一個變數是什麼基本數據類型,當變數的值是null和對象時,typeo操作符會返回“Object”。當我們想知道對象時什麼類型的對象時,可以用instanceof操作符。
語法如下:
result = variable instanceof constructor
如果變數是給定引用類型的實例,instanceof會返回true。
eg:
1 alert(person instanceof Object); //變數person是Object嗎?
註意:
ECMA-262規定任何在內部實現[[Call]]方法的對象都應該在應用typeof操作符時返回“function”,由於Safari 5及之前版本和Chrome 7及之前版本的正則表達式實現了這個方法,因此對正則表達式應用typeof會返回“function”,在ie和Firefox中,對正則表達式應用typeof會返回“Object”。