標籤:結果 堆記憶體 font str bool ima nbsp 引用 define
資料類型
在 javascript 中資料類型可以分為兩類:
- 基本類型值 primitive type,比如Undefined,Null,Boolean,Number,String。
- 參考型別值,也就是物件類型 Object type,比如Object,Array,Function,Date等。
變數的複製
眾所周知,js中變數的基本類型和參考型別儲存方式是不同的,這也就導致變數複製時也就不同了。如果從一個變數向另一個變數複製基本類型的值時,會將前者的值複製一個,然後將複製的值賦值到後者,因此這兩個值是完全獨立的,只是他們的value相同而已。
var num1 = 10;var num2 = num1;console.log(num2);//10
上面的num1中被儲存的值為10,當把num1的值賦值給num2時,num2的值也為10。但是這兩個10是完全獨立的,num2中的10隻是被複製出來的,相當於我寫了一個word文檔,把它放到了num1的檔案夾中,然後我再複製這個word文檔,就叫word副本吧,然後把這個副本放到num2的檔案夾下,這兩個word文檔是完全一樣的,修改任何一個都不會影響兩一個。
num2 += 1;console.log(num1); //10console.log(num2); //11
從上面可以看出修改num2的值,num1的值未發生變化。再來看下參考型別的複製。當從一個變數向另一個變數複製參考型別的值時,同樣也會將儲存在變數對象中的值複製一份放到為新變數分配的空間中。
var obj1 = { name : "111"};var obj2 = obj1;console.log(obj2.name); //111obj2.name = "222";console.log(obj1.name); //222
第一次列印出的結果為“111”,這個我們很容易理解,但是第二次列印出來的是“222”,有點莫名其妙了。這就是參考型別和基本類型的不同之處了。複製對象時並不會在堆記憶體中新產生一個一模一樣的對象,只是多了一個儲存指向這個對象指標的變數罷了。將obj1的值複製給obj2,而這個值的副本實際上是一個指標,這個指標指向儲存在堆中的一個對象,也就是說建立了一個新的記憶體位址傳給了obj2,obj1和obj2兩個變數同時指向了同一個Object,當去改變這個對象時,他們的值都會改變,也就是說他們中任何一個作出的改變都會反映在另一個身上。下面的簡易圖可能更明了些。
JS函數中的參數傳遞