javascript中變量重新賦值和引用重新賦值問題


javascript中經常會遇到這樣的問題:

 
var a=3;
var b=a;
a=5;
; //結果為5;
; //結果為3;
 
而在下面的代碼中情況卻發生了變化:
 
var a=1,b=2,c=3;
var Array=[a,b,c];
a=5;
;  //結果為1,沒有發生變化;
 
 
var a=1,b=2,c=3;
var Array=[a,b,c];
Array[0]=5;
; //結果為1,a沒有發生變化
 
在接下來的代碼中情況又不同:
 
var a=1,b=2,c=3;
var Array=[a,b,c];
Array2=Array;
Array[0]=5;
; //結果為5;
 
 
var a=1,b=2,c=3;
var Array=[a,b,c];
var Array2=Array;
Array2[0]=5;
; //結果為5;
 
接下來解釋上面代碼執行結果不同的原因:
首先是棧和堆的問題,棧中儲存的是基本類型的變量和對象的引用,它們的值直接存放在棧中;而堆中儲存的是復雜的數據類型,例如數組對象和Object對象,他們的引用變量存儲在棧中,指向存儲在堆中的實際對象。
 
發生上面情況的原因是棧中的數據可以共享,在第一段代碼中,a=3執行的時候棧中為值3分配了空間,而b=a的時候,b=3,關鍵是當a的值改變為5之后b的值卻沒有改變,這就是因為棧中數據可以共享的原因。假如執行a=3,b=3;a=3執行時為3分配了內存,那么b=3的時候不會在棧中分配內存存儲3這個值,而是讓b去指向已有的3,當a=5的時候,程序去尋找棧中有沒有5這個值,如果有則讓a去指向5,如果沒有則重新分配內存存儲5,顯示在上面的例子中,a=5重新分配了內存,a此時指向了5,而b指向的值是3,並不會因為a的值的改變而改變。
 
在第二段程序中使用了數組,數組是存儲在堆中的,當創建一個數組時,在堆中創建了一個數組對象,而在棧中創建了對數組的引用,指向存儲在堆中的實際對象。所以當Array=[a,b,c]執行后,Array[0]=1,Array[1]=2,Array[2]=3;當a的值改變即a=5執行時,a先去檢查棧中有沒有5這個值,如果有則a直接指向5,如果沒有則分配內存存儲5,a指向5,但Array[0]的值並沒有因此發生改變; 而Arrry[0]=5執行時,實際更改的是堆中的數據,不影響棧中a的值。Array=[a,b,c]相當於將a,b,c的值復制到了堆中。
 
在第三段程序中,Array2=Array,當Array的值發生改變時,實際更改的是堆中的對象,所以一個值改變,則兩個數組對應的值都改變


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM