JavaScript中參數(shù)傳遞方式詳解
在JavaScript中,參數(shù)的數(shù)據(jù)傳遞方式一般是按值傳遞、引用傳遞,今天遇到有人問如下這個問題
const obj = { value: 1 }; function foo(o) { o = 2; console.log(o); //2 } foo(obj); console.log(obj.value); // 1 console.log(obj); // { value: 1 }
問為什么obj的值沒有改變,按照引用傳遞的方式,最后一行打印的值不是2,而是{ value: 1 }
,
一開始給我也問懵了。確實,最近寫iOS代碼比較多,按照OC語言的邏輯,如果原先存在一個引用型數(shù)據(jù)類型A,給這個A賦值引用數(shù)據(jù)類型B,那么就會A等于B,A和B的內(nèi)存地址是同一塊,原先的A就不存在了。如果按照這個邏輯,確實應(yīng)該打印2,但是!這是JS,不是OC,反應(yīng)了片刻,和他簡單介紹了JS參數(shù)傳遞的幾種方式:
按值傳遞
這個是最基本的傳遞方式,最符合直觀認(rèn)知的。大家看一下代碼就會明白,即使不會JS會、沒啥編程經(jīng)驗的人也能理解。
function add(param){ param+=10; console.log(param);//11 } const num = 1; add(num); console.log(num);//1
這里,參數(shù)param的改變對于num是沒有任何影響的,因為這里是num的值復(fù)制給了函數(shù)add內(nèi)部的局部變量param,所以在函數(shù)內(nèi)部改變param的值并不會影響外部num的值。
引用類型
紅寶書中這么介紹引用類型的:
ECMAScript 中所有函數(shù)的參數(shù)都是按值傳遞的。這意味著函數(shù)外的值會被復(fù)制到函數(shù)內(nèi)部的參數(shù) 中,就像從一個變量復(fù)制到另一個變量一樣。如果是原始值,那么就跟原始值變量的復(fù)制一樣,如果是 引用值,那么就跟引用值變量的復(fù)制一樣。
話不多說,上代碼:
const value = { value: 1 }; function fun(o) { o.value = 2; console.log(o.value);//2 console.log(o);//{value: 2} } fun(value); console.log(value);//{value: 2} console.log(value.value);//2
函數(shù)內(nèi)部對形參的操作影響到了外部實參,這里就是引用類型。hba
共享類型
那什么是共享類型呢?
說實話我暫時沒在紅寶書中找到這種說話,但是'坊間'一直流傳著共享類型的傳說。
還是剛剛那段代碼:
const obj = { value: 1 }; function foo(o) { o = 2; console.log(o); //2 } foo(obj); console.log(obj.value); // 1 console.log(obj); // { value: 1 }
簡單來說就是:對于傳遞到函數(shù)參數(shù)的對象類型,如果直接改變了拷貝的引用的指向地址,那是不會影響到原來的那個對象;如果是通過拷貝的引用,去進(jìn)行內(nèi)部的值的操作,那么就會改變到原來的對象的。
意味著,這段代碼的執(zhí)行關(guān)鍵就在 o = 2;
將原先存放參數(shù)o的內(nèi)存地址,存放了2(這里可能對于地址更換的細(xì)節(jié)有出入,但是不影響理解),也就是原先的參數(shù)o和obj沒有任何關(guān)系了,轉(zhuǎn)而存放了2這個值,賦值操作導(dǎo)致標(biāo)識符發(fā)生了重新綁定Rebinding,重新復(fù)制的標(biāo)識符會指向新的內(nèi)存空間。
到此這篇關(guān)于JavaScript中參數(shù)傳遞方式詳解的文章就介紹到這了,更多相關(guān)javascript參數(shù)傳遞內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入探究JavaScript的類型判斷(從基礎(chǔ)到精通)
JavaScript 語言具有多種數(shù)據(jù)類型,它們可以大致分為兩大類:基本數(shù)據(jù)類型(Primitive Data Types)和引用數(shù)據(jù)類型(Reference Data Types),本文將帶大家一起從基礎(chǔ)到精通深入探究JavaScript的類型判斷,需要的朋友可以參考下2024-05-05淺析Echarts圖表渲染導(dǎo)致內(nèi)存泄漏的原因及解決方案
在今年某個可視化大屏項目中,出現(xiàn)了一個問題,項目在運行一段時間后,頁面出現(xiàn)了崩潰,而且是大概運行幾天之后,因為大屏項目是部署到客戶現(xiàn)場大屏,長時間運行不關(guān)閉,小編認(rèn)為 Echarts 圖表渲染導(dǎo)致了內(nèi)存泄漏,本文將深入分析這一問題,并提供解決方案2023-10-10typescript返回值類型和參數(shù)類型的具體使用
本文主要介紹了typescript返回值類型和參數(shù)類型的具體使用文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06