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