1. 程式人生 > >javascript中變量重新賦值和引用重新賦值問題

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

重新 復制 asc 代碼執行 問題 數據類型 更改 [0 遇到

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的值發生改變時,實際更改的是堆中的對象,所以一個值改變,則兩個數組對應的值都改變

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