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