這幾天遇到j(luò)s參數(shù)傳遞方式的問題,深切探究一番,將所得結(jié)果總結(jié)于此
常見的幾種傳遞方式 傳值調(diào)用(call by value)傳引用調(diào)用(call by reference)</>復(fù)制代碼
在傳值調(diào)用中實際參數(shù)被求值,其值被綁定到函數(shù)中對應(yīng)的變量上(通常是把值復(fù)制到新內(nèi)存區(qū)域)。在函數(shù)返回后調(diào)用者作用域里的曾傳給函數(shù)的任何東西都不會變。
傳共享對象調(diào)用(call by sharing)</>復(fù)制代碼
在“傳引用調(diào)用”求值中,傳遞給函數(shù)的是它的實際參數(shù)的隱式引用(即實際參數(shù)的地址)而不是實參的拷貝。通常函數(shù)能夠修改這些參數(shù)(比如賦值),而且改變對于調(diào)用者是可見的。
JS中的傳值方式 Number--傳值調(diào)用</>復(fù)制代碼
在傳共享對象調(diào)用中,傳遞給函數(shù)的是實參所指向引用對象的地址,而不是實參的地址,即傳遞共享對象。故在函數(shù)中修改引用對象時,實參的值也會跟著變化,而如果是重新給新參賦值后,再進行任何修改都不會影響到外面的實參了。
</>復(fù)制代碼
let a = 1;
function add(val) {
val += 1;
console.log(`val=${val}`); // 2
}
add(a);
console.log(`a=${a}`); // 1
String--傳值調(diào)用
</>復(fù)制代碼
let a = "hahaha";
function change(val) {
val = "heiheihei";
console.log(`val=${val}`); // heiheihei
}
change(a);
console.log(`a=${a}`); // hahaha
Boolean--傳值調(diào)用
Symbol--傳值調(diào)用
</>復(fù)制代碼
let a = Symbol("prop");
function change(val) {
val = Symbol(2);
console.log(`val=${val.toString()}`); // Symbol(2)
}
change(a);
console.log(`a=${a.toString()}`); // Symbol(prop)
null--傳值調(diào)用
undefined--傳值調(diào)用
Object--傳共享對象調(diào)用
</>復(fù)制代碼
let obj = {
a: 1
}
function change(obj) {
obj.a = 2;
console.log(obj); // {a: 2}
obj = {
a: 3
}
console.log(obj); // {a: 3}
}
change(obj);
console.log(obj); // {a: 2}
從上面的代碼可以看出,在函數(shù)中對參數(shù)所指向的對象進行修改時會影響到外面的實參,但對函數(shù)參數(shù)重新賦值時,不會影響到實參,故js引用類型的傳值方式為call by sharing
深入探究 變量存儲方式在C#中類型有兩種:值類型和引用類型,它們之間的卻別在于實際數(shù)據(jù)存儲的位置(如上圖)。值類型的變量和實際數(shù)據(jù)都存儲在堆棧中;而引用類型則只有變量存儲在堆棧中,變量存儲著實際數(shù)據(jù)的地址,實際數(shù)據(jù)存儲在與地址相對應(yīng)的托管堆中。
C#中的值傳遞正常情況下,值類型按值傳遞
正常情況下,應(yīng)用類型按共享對象的方式傳遞(call by sharing),但string類型除外(由于string的不可變性,它是按值傳遞的)
通過使用ref或out關(guān)鍵字,值類型和引用類型都可以按引用傳遞
總結(jié)綜上所述(證明題2333),值傳遞和引用傳遞的參數(shù)類型既可以是值類型又可以是引用類型,但是call by sharing的參數(shù)類型只能是引用類型。
</>復(fù)制代碼
個人理解:JS中,null賦值的變量時對象,但是,變量指向的引用地址為空,故在函數(shù)中修改參數(shù)的值,對實參不會又任何影響,所以是按值傳遞。string類型應(yīng)該跟C#按值傳遞的原因一致。
參考:
維基百科
JS中的值是按值傳遞,還是按引用傳遞呢
《Learning hard C#學(xué)習(xí)筆記》第10章
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/108413.html
摘要:深入系列第九篇,除了按值傳遞引用傳遞,還有第三種傳遞方式按共享傳遞定義在高級程序設(shè)計第三版,講到傳遞參數(shù)中所有函數(shù)的參數(shù)都是按值傳遞的。 JavaScript深入系列第九篇,除了按值傳遞、引用傳遞,還有第三種傳遞方式 —— 按共享傳遞 定義 在《JavaScript高級程序設(shè)計》第三版 4.1.3,講到傳遞參數(shù): ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。 什么是按值傳遞呢?...
摘要:寫在最前本次嘗試通過流程圖的形式并結(jié)合兩個例子來重新理解一下中的參數(shù)傳遞。歡迎關(guān)注我的博客,不定期更新中參數(shù)到底如何傳遞借用紅寶書的一句話中所有函數(shù)的參數(shù)都是按值傳遞的這個值如果是簡單類型,那么就是其本身。同時執(zhí)行第一個結(jié)果即為。 寫在最前 本次嘗試通過流程圖的形式并結(jié)合兩個例子來重新理解一下JavaScript中的參數(shù)傳遞。 歡迎關(guān)注我的博客,不定期更新中—— 參數(shù)到底如何傳遞? 借...
摘要:參數(shù)引用函數(shù)的上下文,函數(shù)上下文來自于等面向?qū)ο笳Z言,中的依賴于函數(shù)聲明。沒有重載函數(shù)沒有簽名,因為其參數(shù)是由包含零或多個值的數(shù)組來表示的。這就是重載函數(shù)。重載函數(shù)常用來實現(xiàn)功能類似而所處理的數(shù)據(jù)類型不同的問題。 1 函數(shù)參數(shù) 函數(shù)的實參和形參個數(shù)可以不等,之所以會這樣,原因是 ECMAScript 中的參數(shù)在內(nèi)部是用一個數(shù)組來表示的。函數(shù)接收到的始終都是這個數(shù)組,而不關(guān)心數(shù)組中包含哪...
摘要:參數(shù)引用函數(shù)的上下文,函數(shù)上下文來自于等面向?qū)ο笳Z言,中的依賴于函數(shù)聲明。沒有重載函數(shù)沒有簽名,因為其參數(shù)是由包含零或多個值的數(shù)組來表示的。這就是重載函數(shù)。重載函數(shù)常用來實現(xiàn)功能類似而所處理的數(shù)據(jù)類型不同的問題。 1 函數(shù)參數(shù) 函數(shù)的實參和形參個數(shù)可以不等,之所以會這樣,原因是 ECMAScript 中的參數(shù)在內(nèi)部是用一個數(shù)組來表示的。函數(shù)接收到的始終都是這個數(shù)組,而不關(guān)心數(shù)組中包含哪...
摘要:混合應(yīng)用在幾年前便進入大眾視野,近來更是越發(fā)風(fēng)生水起,深受人民群眾的喜愛。混合方式如同茴字有幾種寫法一般,構(gòu)建混合應(yīng)用也有不同的方式。機型則會比較悲劇,使用方案或許是個正確的選擇。所以在開發(fā)中一定要做好可用性檢測,減少出現(xiàn)的幾率。 混合應(yīng)用(hybird app) 在幾年前便進入大眾視野,近來更是越發(fā)風(fēng)生水起,深受人民群眾的喜愛。 概念 什么是混合應(yīng)用 混合應(yīng)用(hybird app)...
閱讀 2051·2021-11-25 09:43
閱讀 1968·2019-08-30 13:56
閱讀 1232·2019-08-30 12:58
閱讀 3432·2019-08-29 13:52
閱讀 764·2019-08-26 12:17
閱讀 1470·2019-08-26 11:32
閱讀 946·2019-08-23 13:50
閱讀 1310·2019-08-23 11:53