在編程語言中,賦值和參數傳遞能夠經過value-copy(值複製)或者reference-copy(引用複製)來完成,這取決於使用的是什麼語法。編程
C語言中有指針這個概念,若是要向函數傳遞一個數並在函數中更改它的值,能夠經過‘&’傳遞變量,這就是reference-copy;如果沒有聲明爲引用的話,就是經過value-copy的方式傳遞。數組
但在JavaScript中沒有指針這個概念,但也有這兩種複製,不過,在語法上沒有區別,而且引用指向的是值。這兩種複製徹底根據值的類型來決定。編程語言
// 第一種 let a = 2; let b = a; // b是a的值一個副本,也就是value-copy b++; a; //2 b; //3 // 第二種 let c = [1, 2, 3]; let d = c; // d是[1, 2, 3]的一個引用,引用指向的是值哦,這是reference-copy d.push(4); c; // [1, 2, 3, 4] d; // [1, 2, 3, 4]
由上可知,基本類型的值是經過值複製的方式來賦值或是傳遞的,基本類型有null、undefined、字符串、數字、布爾以及ES6中的symbol。
引用類型的值是經過引用複製的方式來賦值或是傳遞的,引用類型有數組、對象、函數等。
因爲引用指向的是值自己而非變量,因此一個引用沒法更改另外一個引用的指向。也就是說,多個引用相互之間沒有引用/指向關係。關於這點,看代碼就清楚了,以下:函數
let c = [1, 2, 3]; let d = c; // 這時d和c都爲[1, 2, 3] d = [4, 5, 6]; c; // [1, 2, 3] d; // [4, 5, 6] // d = [4, 5, 6];這句賦值語句並不會影響c指向值[1, 2, 3],除非b是指向c的,但上面咱們已經說過‘引用指向的是值自己而非變量’!!! // 要知道直接賦值和push()是不同的,前者是從新引用,然後者是在引用的基礎上往裏面加東西。 // 如果想要在引用的基礎上清空數組,能夠用arr.length = 0的方式
特別要注意的一點是,那些基本類型,在初始化時,能夠封裝成對象,可就算如此操做,仍是更改不了‘它是基本類型值’的事實,因此仍是value-copy,代碼以下:指針
function add(x) { x += 1; } let a = new Number(1); // typeof a => object add(a); a; // a爲2,而不是3