JS中按值傳遞和按引用傳遞

Js中按值傳遞和按引用傳遞

文章思路:

js的數(shù)值類型(基本類型,引用類型)--數(shù)組是引用類型?--對象的參數(shù)傳遞--面試題

在介紹Js的賦值方式時首先要說明js的數(shù)值類型:基本類型和引用類型

1.基本類型
基本的數(shù)據(jù)類型有:undefined,boolean,number,string,null“浚基本類型存放在棧區(qū),訪問是按值訪問,就是說你可以操作保存在變量中的實際的值

當(dāng)基本類型的數(shù)據(jù)賦值時之碗,賦的是實際的值:
var a = 10,b=a;

a=20;

a == > 20;b ==> 10

說明:a和b是沒有關(guān)聯(lián)關(guān)系的,b由a賦值得到季希,相互獨立

2.引用類型
引用類型指的是對象褪那,可以擁有屬性和方法幽纷,并且我們可以修改其屬性和方法。引用對象存放的方式是:在棧中存放對象變量標(biāo)示名稱和該對象在堆中的存放地址博敬,在堆中存放數(shù)據(jù)友浸。
對象使用的是引用賦值。當(dāng)我們把一個對象賦值給一個新的變量時偏窝,賦的其實是該對象在堆中的地址收恢,而不是堆中的數(shù)據(jù)。也就是兩個對象指向的是同一個存儲空間囚枪,無論哪個對象發(fā)生改變派诬,其實都是改變的存儲空間的內(nèi)容劳淆,因此链沼,兩個對象是聯(lián)動的。

比如:

var obj = { x = 1}
var obj2 = obj;
obj.x = 3;

obj.x == > 3
obj2.x ==> 3

3.數(shù)組是引用類型
我們先來看一個例子:

var a = [1,2,3]
var b = a;
a = [4,5,6];
b ==> [1,2,3]

難道數(shù)組是基本類型沛鸵?括勺?別急,我們再看看一個例子

var a = [1,2,3];
var b = a;
a.pop();
a ==> [1,2]
b ==> [1,2]

這是怎么回事呢曲掰?
以下是來自于一個知乎大神的解釋:
a = [4,5,6] -- 改變的是a引用本身疾捍,沒有改變數(shù)組對象,a和b沒有關(guān)系
a.pop() -- 改變的是數(shù)組對象栏妖,a引用沒有變乱豆。
b = a; -- 該操作后,b直接指向數(shù)組對象吊趾,不是b指向a宛裕,a再指向數(shù)組。所以改變a引用并不會堆b引用造成影響论泛,改變數(shù)組對象可以

4.參數(shù)傳遞
對于js來說揩尸,基本類型是按值傳遞的:
舉例:

var a = 1;
function foo(x){
    x = 2;
}
foo(a)
a ==> 1 //仍然是1,沒有受到x=2的影響

所以:按值傳遞就是復(fù)制了份a內(nèi)容給x而已屁奏,a和x之間沒有關(guān)系

再來看看對象

var obj = {x:1}
function foo(o){
    o.x=3;
}
foo(obj)
obj.x ==> 3 //被修改了Q矣堋!坟瓢!
這樣是否說明JS的對象是按引用傳遞的呢勇边?我們再來看看下面的例子
var obj = {x:1}
funtion foo(o){
    o = 100;
}
foo(obj)
obj.x ==> 1 //仍然是1,并沒有被修改

如果是按引用傳遞折联,修改形參o的值粒褒,應(yīng)該影響到實參才對。但這里修改o的值并未影響obj崭庸。 因此JS中的對象并不是按引用傳遞怀浆。那么究竟對象的值在JS中如何傳遞的呢谊囚?

答案是:JS的基本類型是按值傳遞,對象類型是按共享傳遞的执赡,該方法的重點是:調(diào)用函數(shù)傳參時镰踏,函數(shù)接受對象實參引用的副本(既不是按值傳遞的對象副本,也不是按引用傳遞的隱式引用)沙合。 它和按引用傳遞的不同在于:在共享傳遞中對函數(shù)形參的賦值奠伪,不會影響實參的值。如下面例子中首懈,不可以通過修改形參o的值绊率,來修改obj的值。

簡單的說究履,就是滤否,引用類型中,函數(shù)接收到的是實參引用的副本最仑,所以對形參的賦值藐俺,不會影響到實參的值,就正如上面的例子泥彤,不能通過修改形參o的值來修改obj的值

然而欲芹,雖然引用的是副本,引用的對象也是相同的吟吝。他們共享相同的對象菱父,所以修改形參對象的屬性值,也會影響到實參的屬性值
就比如:

 var obj = {x : 1};
 function foo(o) {
     o.x = 3;
 }
 foo(obj);
 console.log(obj.x); // 3, 被修改了!

最后我們看一個js面試題:

var a = 1;

var obj = {
    b: 2
};

var fn = function () {};
fn.c = 3;
 
function test(x, y, z) {
    x = 4;
    y.b = 5;
    z.c = 6;
    return z;
}
test(a, obj, fn);
alert(a + obj.b + fn.c);

首先test傳遞進(jìn)去的實參中剑逃,a是基本類型(浙宜,復(fù)制了一份值),obj是object(指向地址炕贵,你動我也動)梆奈,fn也當(dāng)然不是基本類型啦。在執(zhí)行test的時候称开,x被賦值為4(跟a沒關(guān)系亩钟,各玩各的,a仍然為1)鳖轰,y的b被賦值為5清酥,那obj的b也變?yōu)?,z的c變?yōu)?蕴侣,那fn的c當(dāng)然也會是6. 所以alert的結(jié)果應(yīng)該是1+5+6 =12. (其實test不返回z也一樣焰轻,z仍然改變的)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市昆雀,隨后出現(xiàn)的幾起案子辱志,更是在濱河造成了極大的恐慌蝠筑,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揩懒,死亡現(xiàn)場離奇詭異什乙,居然都是意外死亡,警方通過查閱死者的電腦和手機已球,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門臣镣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人智亮,你說我怎么就攤上這事忆某。” “怎么了阔蛉?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵弃舒,是天一觀的道長。 經(jīng)常有香客問我馍忽,道長棒坏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任遭笋,我火速辦了婚禮,結(jié)果婚禮上徒探,老公的妹妹穿的比我還像新娘瓦呼。我一直安慰自己,他們只是感情好测暗,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布央串。 她就那樣靜靜地躺著,像睡著了一般碗啄。 火紅的嫁衣襯著肌膚如雪质和。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天稚字,我揣著相機與錄音饲宿,去河邊找鬼。 笑死胆描,一個胖子當(dāng)著我的面吹牛瘫想,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播昌讲,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼国夜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了短绸?” 一聲冷哼從身側(cè)響起车吹,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤筹裕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后窄驹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饶碘,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年馒吴,在試婚紗的時候發(fā)現(xiàn)自己被綠了扎运。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡饮戳,死狀恐怖豪治,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扯罐,我是刑警寧澤负拟,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站歹河,受9級特大地震影響掩浙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秸歧,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一厨姚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧键菱,春花似錦谬墙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侵蒙,卻和暖如春造虎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背纷闺。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工算凿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人急但。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓澎媒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親波桩。 傳聞我的和親對象是個殘疾皇子戒努,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容