js函數(shù)傳參是按值傳遞還是按引用傳遞?

閑話少述,直切主題

從這個(gè)問題出發(fā),首先我們應(yīng)該知道一個(gè)概念,js的基本類型和引用類型有哪些?

基本類型:Number Boolean String Null Undefined
引用類型:Object(對象),在js 中函數(shù)和數(shù)組也是一個(gè)對象?
那為什么說函數(shù)也是一個(gè)對象

以上圖中 簡單的代碼是創(chuàng)建一個(gè)函數(shù)的兩個(gè)方法?
并利用console.dir() 方法打印出它的所有屬性和方法


由控制臺所得結(jié)果看 兩者都可以成功創(chuàng)建一個(gè)函數(shù)

function fn 定義一個(gè)具名實(shí)際上是 通過 Function() 構(gòu)造函數(shù) 構(gòu)造出來的一個(gè)fn 實(shí)例
可從下圖得知 js的原型鏈中 定義 所有的對象都有一個(gè) __proto__屬性 這個(gè)屬性是指向構(gòu)造函數(shù)的prototype

函數(shù)相比較于其他類型 也比較特殊 會有兩個(gè)屬性 prototype 和?__proto__?
prototype 自身原型 和 構(gòu)造函數(shù)__proto__? 原型兼有
從__proto__ 可以看出 function 的 構(gòu)造器(constructor)是?Function()

所以在js 中我們都說function? 實(shí)際上是?Function() 構(gòu)造函數(shù)實(shí)例出來的一個(gè)對象


介紹完 js 的基本類型 和 引用類型 我們還要說一下 這些類型 在js 中是怎么樣進(jìn)行存儲
在js 中 寫下 var a = 10; var obj = {a:10,b:function() { console.log(a) }};
js 到底做了什么事情
1.變量提升 var a; var obj = new Object();a=10;obj =?{a:10,b:function() { console.log(a) }};
2.定義變量的同時(shí)
基本類型 就在棧中開辟一塊空間 命名為a 存儲10
引用類型 就在棧中開辟一塊空間 命名為obj 但obj 存儲的不再是值 而是該對象的指針 每次使用該對象的時(shí)候 去堆中獲取該指針對應(yīng)的實(shí)例

所以在 js 函數(shù)中傳參 到底是按值傳遞還是 按引用傳遞 就躍然于紙上了 但還有一些特殊情況的

具體解析如下


此時(shí)的a 應(yīng)為 10?
為什么? 背后做了些什么操作
1.將變量a 作為實(shí)參 傳遞給 函數(shù)fn 實(shí)際上是把 a 變量復(fù)制了 一份 傳遞給了 fn 所以函數(shù)內(nèi)部如何改變傳進(jìn)來的實(shí)參 外部a是無影響的
這就是按值傳遞 按值傳遞主要是將基本類型作為 實(shí)參傳遞給函數(shù) 所遵循的規(guī)則

那我們來看 第二種引用 傳遞
何用引用傳遞 引用傳遞的現(xiàn)象又是什么?


此時(shí)的obj 應(yīng)為 {a:20,b:function() {console.log(12345)}}?

為什么? 背后做了些什么操作
1.將變量obj 作為實(shí)參 傳遞給 函數(shù)fn 實(shí)際上是把 obj 變量的指針給了函數(shù)的形參 就是前文中提到的放在棧中的指針 所以函數(shù)內(nèi)部對obj 的屬性進(jìn)行改變 后部的變量也該進(jìn)行改變

這就是引用傳遞 引用傳遞主要是將引用類型作為 實(shí)參傳遞給函數(shù) 所遵循的規(guī)則

但還有一種特殊情況,請往下看

看到這段代碼 你可能會覺得 它應(yīng)該也是按引用傳遞的規(guī)則

但實(shí)際上它不是按引用傳遞 也不能理解為按值傳遞 有人將其叫做共享傳遞 那它怎么情況下出現(xiàn)呢
1.將變量obj 作為實(shí)參 傳遞給 函數(shù)fn 實(shí)際上是把 obj 變量的指針 就是前文中提到的放在棧中的指針 實(shí)際上實(shí)參傳參給函數(shù)的形參依然是傳遞一個(gè)指針(也可稱引用)那為什么不是引用傳遞呢
因?yàn)樵诤瘮?shù)內(nèi)部 我們處理了一步 就是h = 10 這樣我們就將10 這個(gè)值傳遞給了形參 形參現(xiàn)在存儲的不再是傳進(jìn)來的實(shí)參的指針 所以不管內(nèi)部形參如何改變 obj都不變
好了 到此終止?。?!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容