1. 按值傳遞
將參數(shù)值傳遞給過(guò)程的方式,使過(guò)程訪問(wèn)到變量的復(fù)本。結(jié)果,過(guò)程不可改變變量的真正值,傳遞的是變量的內(nèi)容。
2. 按引用傳遞
將參數(shù)地址傳遞給過(guò)程的方式,使過(guò)程訪問(wèn)到實(shí)際的變量。結(jié)果,過(guò)程可以改變變量的真正值,傳遞的是變量在內(nèi)存中地址的指針或引用。
先舉個(gè)兩個(gè)例子:
var a = 10;
var b = a;
a = 20;
console.log(b); // 10
var a = [1,2]
var b = a;
a[0] = 3;
console.log(b) // [3,2]
有沒有覺得很神奇,number,string都是基本數(shù)據(jù)類型,而基本數(shù)據(jù)類型存放在棧區(qū),是直接按值存放的,可以直接訪問(wèn);對(duì)象和數(shù)組是存放在堆中的,通過(guò)引用來(lái)賦值,實(shí)際是一個(gè)存放在棧內(nèi)存的指針,這個(gè)指針指向堆內(nèi)存中的地址。
現(xiàn)在我們來(lái)看一下ECMAScript中的數(shù)據(jù)類型。主要分為兩大類:
基本數(shù)據(jù)類型 (undefined,boolean,string,number,null)
var a = 3;
var b = 3;
console.log(a === b) // true
所以記住基本數(shù)據(jù)類型的比較是值的大小。
此處如果用==呢?是會(huì)進(jìn)行類型轉(zhuǎn)換的,舉個(gè)簡(jiǎn)單點(diǎn)的例子:
var a = 10;
var b = '10';
console.log(a == b); // true
引用數(shù)據(jù)類型(object(數(shù)組和函數(shù)))
引用數(shù)據(jù)類型在內(nèi)存中是這樣存的,每個(gè)空間大小不一樣,要根據(jù)情況進(jìn)行特定分配,如下所示:
var personA = {name:'fcc'}
var personB = {name:'fcc1'}
var personC = {name:'fcc2'}

舉個(gè)例子:
var a =[1,2,3,4];
var b =[1,2,3,4];
console.log(a === b); // false
雖然變量a,b內(nèi)容是一樣的,但是在內(nèi)存中卻存在不同的位置,他們指的不是同一個(gè)對(duì)象。
傳值與傳址有和不同?
基本數(shù)據(jù)類型的=是在內(nèi)存中新開辟一段棧內(nèi)存,然后把值賦值到新的棧中。
var a = 1;
var b = a; // 只傳遞值
a++;
console.log(a); // 2
console.log(b); // 1

由圖可以看出,基本數(shù)據(jù)類型是相互不會(huì)影響的。
引用數(shù)據(jù)類型的賦值是傳址,改變指針的方向。就是說(shuō)引用類型的賦值是對(duì)象保存在棧中的地址,兩個(gè)變量之間就指向同一個(gè)對(duì)象,所以操作的時(shí)候互相之間會(huì)有影響。
var a = {}; // a保存了一個(gè)空對(duì)象的實(shí)例
var b = a; // a和b都指向了這個(gè)空對(duì)象
a.name = 'fcc';
console.log(a.name); // 'fcc'
console.log(b.name); // 'fcc'
b.age = 23;
console.log(b.age); // 23
console.log(a.age); // 23
console.log(a == b); // true

由圖可以看出,引用數(shù)據(jù)類型之間是會(huì)相互影響的。