JavaScript 原始值與引用值
ECMAScript變量可以包含兩種不同類型的數據:原始值和引用值。
原始值(primitive value)就是最簡單的數據,引用值(reference value)則是由多個值構成的對象。
保存原始值的變量是按值(by value)訪問的,因為我們操作的就是存儲在變量中的實際值。
引用值是保存在內存中的對象。與其他語言不同,JavaScript不允許直接訪問內存位置,因此也就不能直接操作對象所在的內存空間。在操作對象時,實際上操作的是對該對象的引用(reference)而非實際的對象本身。為此,保存引用值的變量是按引用(by reference)訪問的。
1)動態屬性
只有引用值可以動態添加后面可以使用的屬性。
2)復制值
原始值和引用值在通過變量復制時有所不同。
在通過變量把一個原始值賦值到另一個變量時,原始值會被復制到新變量的位置。
let num1 = 5;
let num2 = num1;
這里,num1包含數值5。當把num2初始化為num1時,num2也會得到數值5。這個值跟存儲在num1中的5是完全獨立的,因為它是那個值的副本。
這兩個變量可以獨立使用,互不干擾。
在把引用值從一個變量賦給另一個變量時,存儲在變量中的值也會被復制到新變量所在的位置。區別在于,這里復制的值實際上是一個指針,它指向存儲在堆內存中的對象。操作完成后,兩個變量實際上指向同一個對象,因此一個對象上面的變化會在另一個對象上反映出來。
3)傳遞參數
ECMAScript中所有函數的參數都是按值傳遞的。這意味著函數外的值會被復制到函數內部的參數中,就像從一個變量復制到另一個變量一樣。
如果是原始值,那么就跟原始值變量的復制一樣,如果是引用值,那么就跟引用值變量的復制一樣。
在按值傳遞參數時,值會被復制到一個局部變量(即一個命名參數,或者用ECMAScript的話說,就是arguments對象中的一個槽位)。
注意 ECMAScript中函數的參數就是局部變量。
4)確定類型
typeof操作符最適合用來判斷一個變量是否為原始類型。更確切地說,它是判斷一個變量是否為字符串、數值、布爾值或undefined的最好方式。如果值是對象或null,那么typeof返回"object"。
typeof雖然對原始值很有用,但它對引用值的用處不大。我們通常不關心一個值是不是對象,而是想知道它是什么類型的對象。為了解決這個問題,ECMAScript提供了instanceof操作符,語法如下:
result= variable instanceof constructor
如果變量是給定引用類型(由其原型鏈決定)的實例,則instanceof操作符返回true。