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