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

