摘要:學習中函數參數值傳遞和引用傳遞的學習中函數參數值傳遞和引用傳遞在紅寶書中說到,中所有函數的參數都是按值傳遞的。
學習JS中函數參數值傳遞和引用傳遞的學習 JS中函數參數值傳遞和引用傳遞
在JavaScript紅寶書中說到,“ECMAScript中所有函數的參數都是按值傳遞的”。理解這個概念先要從JS的堆內存和棧內存說起:棧內存為自動分配的內存空間,它由系統自動釋放;堆內存則是動態分配的內存,大小不定也不會自動釋放。(很初級的理解,有錯誤還望指正)
JS中的5種基本數據類型Undefined、Null、Boolean、Number 和 String,它們是直接按值存放在棧內存中,可以直接訪問。引用類型的值是保存在堆內存中的對象。與其他語言不同,JavaScript不允許直接訪問堆內存中的位置, 也就是說不能直接操作堆內存中的對象。 在操作對象時, 實際上是在操作對象的引用(也可理解為指針)而不是實際的對象。” 這個堆內存中對象的引用(指針)存儲在棧內存中。你只能操作棧內存中的數據。即基礎類型數據和堆內存中對象的指針兩大類
對于基本數據類型的復制就相當于你和小明買了一輛一樣的單車,你對自己單車的操作不會影響到小明的單車。
而對于引用類型的復制,相當于你和小明共用一個客廳,你對這個客廳做的操作是會影響到小明的客廳(即你們共用的客廳)
如下圖:
//測試代碼: //基本類型: var a = 10; var b = a; b = 12; alert(a);//10 alert(b);//12 //引用類型: var a = new Object(); a.name = "Tony"; alert(a.name);//"Tony" var b = a; b.name = "Tom" alert(a.name);//"Tom"參數的傳遞
繼續說參數的傳遞,無論參數是什么類型,都是按值傳遞的,普通類型傳遞的是本身的值,引用類型傳遞的是自己在棧內存中的“指針”值。
function setName(obj) { obj.name = "Nicholas"; } var person = new Object(); setName(person); alert(person.name); // "Nicholas"
實際過程如下圖
...]
//而有一個容易引起誤導的點在于下面這個變化 function setName(obj) { obj.name = "Nicholas"; obj = new Object(); //改變obj的指向,此時obj指向一個新的內存地址,不再和person指向同一個 obj.name = "Greg"; } var person = new Object(); setName(person); alert(person.name); //"Nicholas" //這里只要理解,你不能直接操作堆內存中的對象,你只能通過棧內存中的指針進行操作。
這個函數的過程如下圖:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88871.html
這幾天遇到js參數傳遞方式的問題,深切探究一番,將所得結果總結于此 常見的幾種傳遞方式 傳值調用(call by value) 在傳值調用中實際參數被求值,其值被綁定到函數中對應的變量上(通常是把值復制到新內存區域)。在函數返回后調用者作用域里的曾傳給函數的任何東西都不會變。 傳引用調用(call by reference) 在傳引用調用求值中,傳遞給函數的是它的實際參數的隱式引用(即實際參數的地...
摘要:中所有函數的參數都是按值傳遞的。基本類型本身是按值傳遞,具有不可變性,對基本類型的修改,實質上都是在棧內存中創建了新的值。中把這種拷貝也認為是按值傳遞。 本文共 1200 字,讀完只需 5 分鐘 概述 參數的傳遞分為按值傳遞和按引用傳遞,而 JavaScript 中參數的傳遞只有按值傳遞。 ECMAScript 中所有函數的參數都是按值傳遞的。 所謂按值傳遞就是: 把函數外部的值復制給...
摘要:基本類型和引用類型用操作符定義的變量將成為作用域中的局部變量。在向參數傳遞基本類型的值時,被傳遞的值會被復制給一個局部變量即命名參數。結果依舊是在調用函數初時,與引用的是同一對象,所以首次的屬性賦值會對有所影響。 函數 參數 1.js函數不介意傳遞進來多少個參數,也不在乎傳遞進來參數是什么類型。2.arguments對象:類數組 arguments對象的長度是由傳入的參數個數決定的,...
摘要:基本類型和引用類型用操作符定義的變量將成為作用域中的局部變量。在向參數傳遞基本類型的值時,被傳遞的值會被復制給一個局部變量即命名參數。結果依舊是在調用函數初時,與引用的是同一對象,所以首次的屬性賦值會對有所影響。 函數 參數 1.js函數不介意傳遞進來多少個參數,也不在乎傳遞進來參數是什么類型。2.arguments對象:類數組 arguments對象的長度是由傳入的參數個數決定的,...
摘要:它對數組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執行期間存儲在堆棧中。返回值這是可選的,函數可以返回值,也可以不返回值。變量被推入堆棧,從而在執行時成為的副本。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 22 篇。 想閱讀更多優質文章請猛戳GitHub博客,一年百來篇優質文章等著你! 如果你錯過了前面的章節,可...
閱讀 1438·2021-09-03 10:29
閱讀 3462·2019-08-29 16:24
閱讀 2023·2019-08-29 11:03
閱讀 1415·2019-08-26 13:52
閱讀 2930·2019-08-26 11:36
閱讀 2793·2019-08-23 17:19
閱讀 565·2019-08-23 17:14
閱讀 813·2019-08-23 13:59