成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript參數(shù)按值傳遞的理解

galois / 2468人閱讀

摘要:棧內(nèi)存與堆內(nèi)存簡(jiǎn)單類型的值,它們的值直接存儲(chǔ)在變量訪問(wèn)的位置,這是因?yàn)檫@些簡(jiǎn)單類型占據(jù)的空間是固定的,所以可將他們存儲(chǔ)在較小的內(nèi)存區(qū)域棧中。

看到一個(gè)這樣的問(wèn)題

function setName(obj) {
  obj.name = "Tom";
  obj = new Object();
  obj.name = "Greg" ;
}

var person = new Object();
setName(person);
alert(person.name);  //"Tom"

按照一般的理解第二次重寫(xiě)name屬性會(huì)覆蓋原先的name,輸出應(yīng)該是"Greg"才對(duì)。
這個(gè)問(wèn)題其實(shí)就是高程書(shū)上的原題,高程書(shū)的一些地方看了很多遍,但是每次重看都還是會(huì)有新的理解,這里理解的關(guān)鍵在于JavaScript函數(shù)的參數(shù)是按值傳遞的。
之前只是粗泛的了解參數(shù)按值傳遞,但是卻并沒(méi)有搞清楚本質(zhì),結(jié)合高程書(shū)和知乎的這個(gè)回答鏈接才對(duì)這個(gè)問(wèn)題算是真正理解了。

棧內(nèi)存與堆內(nèi)存

簡(jiǎn)單類型的值,它們的值直接存儲(chǔ)在變量訪問(wèn)的位置,這是因?yàn)檫@些簡(jiǎn)單類型占據(jù)的空間是固定的,所以可將他們存儲(chǔ)在較小的內(nèi)存區(qū)域 – 棧中。這樣存儲(chǔ)便于迅速查尋變量的值。每次復(fù)制都是一個(gè)多帶帶的副本,之間相互獨(dú)立

var num1 = 5; 
var num2 = num1; 

圖示

引用類型的值存儲(chǔ)在堆(heap)中的對(duì)象,也就是說(shuō),存儲(chǔ)在變量處的值是一個(gè)指針(point),指向存儲(chǔ)對(duì)象的內(nèi)存地址。這是因?yàn)椋阂弥档拇笮?huì)改變,所以不能把它放在棧中,否則會(huì)降低變量查尋的速度。相反,放在變量的棧空間中的值是該對(duì)象存儲(chǔ)在堆中的地址。地址的大小是固定的,所以把它存儲(chǔ)在棧中對(duì)變量性能無(wú)任何負(fù)面影響。

var obj1 = new Object(); 
var obj2 = obj1; 
obj1.name = "Nicholas"; 
alert(obj2.name); //"Nicholas" 

圖示

ECMAScript中所有函數(shù)的參數(shù)都是按值來(lái)傳遞的

其實(shí)ECMAScript函數(shù)參數(shù)實(shí)際上是函數(shù)的局部變量,因此本題中將一個(gè)對(duì)象作為參數(shù)傳入時(shí),復(fù)制了一個(gè)指針指向?qū)ο笤诙褍?nèi)存中的內(nèi)存地址。按值復(fù)制傳遞上復(fù)制了一個(gè)指針變量,這個(gè)變量是按值傳遞的。
在調(diào)用函數(shù)內(nèi)部將一個(gè)新的Object賦給obj之前內(nèi)存情況是這樣的:

如果是按引用傳遞,就會(huì)直接把第一個(gè)(也就是變量本身)整個(gè)傳遞進(jìn)去(就不會(huì)有第二格的存在了)
再將新的Object賦給obj之后:

可以看到obj指向新的Object內(nèi)存地址,而person引用的仍然是原來(lái)的Object,并且在函數(shù)內(nèi)部新建的局部對(duì)象會(huì)在函數(shù)執(zhí)行完畢后銷毀,因此打印的name是第一個(gè)。

參考書(shū)籍

《JavaScript高級(jí)程序設(shè)計(jì)》

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85134.html

相關(guān)文章

  • JavaScript深入之參數(shù)按值傳遞

    摘要:深入系列第九篇,除了按值傳遞引用傳遞,還有第三種傳遞方式按共享傳遞定義在高級(jí)程序設(shè)計(jì)第三版,講到傳遞參數(shù)中所有函數(shù)的參數(shù)都是按值傳遞的。 JavaScript深入系列第九篇,除了按值傳遞、引用傳遞,還有第三種傳遞方式 —— 按共享傳遞 定義 在《JavaScript高級(jí)程序設(shè)計(jì)》第三版 4.1.3,講到傳遞參數(shù): ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。 什么是按值傳遞呢?...

    DataPipeline 評(píng)論0 收藏0
  • JavaScript參數(shù)按值傳遞理解

    摘要:棧內(nèi)存與堆內(nèi)存簡(jiǎn)單類型的值,它們的值直接存儲(chǔ)在變量訪問(wèn)的位置,這是因?yàn)檫@些簡(jiǎn)單類型占據(jù)的空間是固定的,所以可將他們存儲(chǔ)在較小的內(nèi)存區(qū)域棧中。 看到一個(gè)這樣的問(wèn)題 function setName(obj) { obj.name = Tom; obj = new Object(); obj.name = Greg ; } var person = new Object();...

    NeverSayNever 評(píng)論0 收藏0
  • call by sharing——JavaScript中“共享傳參”和“按值傳參”理解

    摘要:眾所周知,中參數(shù)是按值傳遞的。先大概介紹按值傳參基本類型基本類型的參數(shù)傳遞比較簡(jiǎn)單,示例代碼的值復(fù)制給了函數(shù)內(nèi)部的局部變量所以在函數(shù)內(nèi)部改變的值并不會(huì)影響外部的值。 眾所周知,JavaScript中參數(shù)是按值傳遞的。與訪問(wèn)變量不同,基本類型和引用類型的參數(shù)在傳遞時(shí)都如同變量的復(fù)制。 但是我們?cè)谑褂靡妙愋偷膮?shù)傳遞時(shí),經(jīng)常會(huì)發(fā)現(xiàn)在函數(shù)內(nèi)改變引用類型參數(shù)(如對(duì)象)會(huì)在函數(shù)外反映出來(lái),這種...

    jsdt 評(píng)論0 收藏0
  • 深入理解javascript按值傳遞與按引用傳遞

    摘要:引用類型參數(shù)的傳遞與引用類型的復(fù)制一樣,傳遞的是內(nèi)存地址。指向一個(gè)新的地址,與不再指向同一個(gè)地址官方解釋來(lái)一發(fā)中所有函數(shù)的參數(shù)都是按值傳遞的。總結(jié)很簡(jiǎn)單,函數(shù)參數(shù)都是按值傳遞都是棧內(nèi)數(shù)據(jù)的拷貝。 基本類型與引用類型 值類型(基本類型):String,Number,Boolean,Null,Undefined。 引用類型:Array、Object、Function、Date等有多個(gè)值...

    陳江龍 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

galois

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<