JS學習之賦值與賦引用
阿新 • • 發佈:2018-10-31
內容 當前 都沒有 分享 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學習之賦值與賦引用