摘要:棧內(nèi)存與堆內(nèi)存簡(jiǎn)單類型的值,它們的值直接存儲(chǔ)在變量訪問的位置,這是因?yàn)檫@些簡(jiǎn)單類型占據(jù)的空間是固定的,所以可將他們存儲(chǔ)在較小的內(nèi)存區(qū)域棧中。
看到一個(gè)這樣的問題
function setName(obj) { obj.name = "Tom"; obj = new Object(); obj.name = "Greg" ; } var person = new Object(); setName(person); alert(person.name); //"Tom"
按照一般的理解第二次重寫name屬性會(huì)覆蓋原先的name,輸出應(yīng)該是"Greg"才對(duì)。
這個(gè)問題其實(shí)就是高程書上的原題,高程書的一些地方看了很多遍,但是每次重看都還是會(huì)有新的理解,這里理解的關(guān)鍵在于JavaScript函數(shù)的參數(shù)是按值傳遞的。
之前只是粗泛的了解參數(shù)按值傳遞,但是卻并沒有搞清楚本質(zhì),結(jié)合高程書和知乎的這個(gè)回答鏈接才對(duì)這個(gè)問題算是真正理解了。
簡(jiǎn)單類型的值,它們的值直接存儲(chǔ)在變量訪問的位置,這是因?yàn)檫@些簡(jiǎn)單類型占據(jù)的空間是固定的,所以可將他們存儲(chǔ)在較小的內(nèi)存區(qū)域 – 棧中。這樣存儲(chǔ)便于迅速查尋變量的值。每次復(fù)制都是一個(gè)多帶帶的副本,之間相互獨(dú)立
var num1 = 5; var num2 = num1;
圖示
引用類型的值存儲(chǔ)在堆(heap)中的對(duì)象,也就是說,存儲(chǔ)在變量處的值是一個(gè)指針(point),指向存儲(chǔ)對(duì)象的內(nèi)存地址。這是因?yàn)椋阂弥档拇笮?huì)改變,所以不能把它放在棧中,否則會(huì)降低變量查尋的速度。相反,放在變量的??臻g中的值是該對(duì)象存儲(chǔ)在堆中的地址。地址的大小是固定的,所以把它存儲(chǔ)在棧中對(duì)變量性能無任何負(fù)面影響。
var obj1 = new Object(); var obj2 = obj1; obj1.name = "Nicholas"; alert(obj2.name); //"Nicholas"
圖示
其實(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引用的仍然是原來的Object,并且在函數(shù)內(nèi)部新建的局部對(duì)象會(huì)在函數(shù)執(zhí)行完畢后銷毀,因此打印的name是第一個(gè)。
原文地址
《JavaScript高級(jí)程序設(shè)計(jì)》
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/85133.html
摘要:深入系列第九篇,除了按值傳遞引用傳遞,還有第三種傳遞方式按共享傳遞定義在高級(jí)程序設(shè)計(jì)第三版,講到傳遞參數(shù)中所有函數(shù)的參數(shù)都是按值傳遞的。 JavaScript深入系列第九篇,除了按值傳遞、引用傳遞,還有第三種傳遞方式 —— 按共享傳遞 定義 在《JavaScript高級(jí)程序設(shè)計(jì)》第三版 4.1.3,講到傳遞參數(shù): ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。 什么是按值傳遞呢?...
摘要:棧內(nèi)存與堆內(nèi)存簡(jiǎn)單類型的值,它們的值直接存儲(chǔ)在變量訪問的位置,這是因?yàn)檫@些簡(jiǎn)單類型占據(jù)的空間是固定的,所以可將他們存儲(chǔ)在較小的內(nèi)存區(qū)域棧中。 看到一個(gè)這樣的問題 function setName(obj) { obj.name = Tom; obj = new Object(); obj.name = Greg ; } var person = new Object();...
摘要:眾所周知,中參數(shù)是按值傳遞的。先大概介紹按值傳參基本類型基本類型的參數(shù)傳遞比較簡(jiǎn)單,示例代碼的值復(fù)制給了函數(shù)內(nèi)部的局部變量所以在函數(shù)內(nèi)部改變的值并不會(huì)影響外部的值。 眾所周知,JavaScript中參數(shù)是按值傳遞的。與訪問變量不同,基本類型和引用類型的參數(shù)在傳遞時(shí)都如同變量的復(fù)制。 但是我們?cè)谑褂靡妙愋偷膮?shù)傳遞時(shí),經(jīng)常會(huì)發(fā)現(xiàn)在函數(shù)內(nèi)改變引用類型參數(shù)(如對(duì)象)會(huì)在函數(shù)外反映出來,這種...
摘要:引用類型參數(shù)的傳遞與引用類型的復(fù)制一樣,傳遞的是內(nèi)存地址。指向一個(gè)新的地址,與不再指向同一個(gè)地址官方解釋來一發(fā)中所有函數(shù)的參數(shù)都是按值傳遞的??偨Y(jié)很簡(jiǎn)單,函數(shù)參數(shù)都是按值傳遞都是棧內(nèi)數(shù)據(jù)的拷貝。 基本類型與引用類型 值類型(基本類型):String,Number,Boolean,Null,Undefined。 引用類型:Array、Object、Function、Date等有多個(gè)值...
閱讀 1183·2021-11-24 09:39
閱讀 2688·2021-09-28 09:35
閱讀 1082·2019-08-30 15:55
閱讀 1376·2019-08-30 15:44
閱讀 886·2019-08-29 17:00
閱讀 1983·2019-08-29 12:19
閱讀 3320·2019-08-28 18:28
閱讀 701·2019-08-28 18:10