1. 程式人生 > >JS學習之賦值與賦引用

JS學習之賦值與賦引用

內容 當前 都沒有 分享 img 定義 con png 技術分享

1、基本類型

基本的數據類型有:undefined,boolean,number,string,null。 基本類型存放在棧區,訪問是按值訪問的,就是說你可以操作保存在變量中的實際的值。

技術分享圖片

當基本類型的數據賦值時,賦得是實際的值,a和b是沒有關聯關系的,b由a復制得到,相互獨立。(字面量的才是基本類型)

技術分享圖片

技術分享圖片


2、引用類型(對象)引用對象存放的方式是:在棧中存放對象變量標示和該對象在堆中的存放地址,在堆中存放數據。即名稱和地址

對象使用的是引用賦值。當我們把一個對象賦值給一個新的變量時,賦的其實是該對象的在堆中的地址,而不是堆中的數據。也就是兩個對象指向的是同一個存儲空間,無論哪個對象發生改變,其實都是改變的存儲空間的內容,因此,兩個對象是聯動的。

技術分享圖片

技術分享圖片

技術分享圖片

function test(x){
          x.push(4);
          x=[4,5,6]; //x重新被賦值,開辟了一塊新空間與原空間不同
                    x.push(7); //操作的是新空間的數據
                    console.log(x);// [4,5,6,7]
     }
     var a=[1,2,3];
     test(a);  // [4,5,6,7]
     /*
      步驟: 1 定義數組[1,2,3]並賦值給a,a指向該數1組
             2、調用函數執行的操作過程是
                1)向原數組插入數字4,原數組變成[1,2,3,4]
                2)定義新數組並賦值給a,此時變量指向了新數組,原數組[1,2,3,4]不變
                3)向新數組中插入7,改變了新數組
                4)執行console.log操作,顯示的是這個最新的數組,即[4,5,6,7]
             3、函數外執行console.log操作。由於函數中,只有第一步操作改變了原數組,後續操作改變的是新賦值的數組[4,5,6](新賦值之後,變量a指向了該新數組,所有後續操作,都是針對的新數組),所以該步操作的結果顯示的是[1,2,3,4]。   
     
*/
function test(x) {
        x.push(4);
        x.length = 0; //清空當前引用數組的數據
                x.push(4, 5, 6, 7);
        console.log(x); // [4,5,6,7]
    }
    var a = [1, 2, 3];
    test(a);
    console.log(a); // [4,5,6,7]
    /*
        定義數組[1,2,3]並賦值給變量a,a指向該數組。
        調用函數foo(a),執行的操作是:
        1、向原數組中插入數字4,原數組變成[1,2,3,4];
        2、清空數組。由於此時變量仍然指向原數組,所以此處操作針對的是原數組,即清空原數組;
        3、向數組中插入數字4,5,6,7。(註意並不是從新賦值)由於沒有重新賦值操作,變量仍然指向原數組,所以原數組變為新數組[4,5,6,7];
        4、執行console.log操作,顯示的是這個最新的數組,即[4,5,6,7]。
函數外執行console.log操作,由於函數中變量都沒有重新賦值,所以每一步操作針對的都是原數組,最終原數組變成了這個最新的數組,即[4,5,6,7]

JS學習之賦值與賦引用