這篇文章主要為大家詳細介紹了JavaScript按值傳遞的方法,文中示例代碼介紹的非常詳細,零基礎(chǔ)也能參考此文章,感興趣的小伙伴們可以參考一下。
松山ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!參數(shù)的傳遞分為按值傳遞和按引用傳遞,而 JavaScript 中參數(shù)的傳遞只有按值傳遞。
ECMAScript 中所有函數(shù)的參數(shù)都是按值傳遞的。
所謂按值傳遞就是:
把函數(shù)外部的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把值從一個變量復(fù)制到另一個變量一樣。
我們知道 JS 中,既有基本數(shù)據(jù)類型又有引用數(shù)據(jù)類型,那么二者的按值傳遞有什么樣的區(qū)別呢?
先給結(jié)論
在向參數(shù)傳遞基本數(shù)據(jù)類型時,被傳遞的值會被復(fù)制給一個局部變量(arguments 類數(shù)組對象中的一個元素)。在向參數(shù)傳遞引用數(shù)據(jù)類型時,會把這個值的內(nèi)存地址賦給一個局部變量。
在 JS 中,數(shù)據(jù)類型分為基本類型和引用類型。
其中基本類型包括:number, string, boolean, undefined, null, Symbol(es 6 新增)。基本類型的值是保存在棧內(nèi)存當中的。
基本數(shù)據(jù)類型的值本身是不會改變的。
let num1 = 5; let num2 = num1;
將保存著原始值的變量 num1 賦值給 num2 后,會將原始值 num1 的副本賦值給新變量 num2, 此后這兩個變量是完全獨立的,他們只是擁有相同的值而已,是完全獨立的拷貝,互不干涉。
引用數(shù)據(jù)類型包括:Function, Array, Object 等等除了基本數(shù)據(jù)類型之外的數(shù)據(jù)。引用數(shù)據(jù)類型是保存在堆內(nèi)存當中的。
JS 不允許直接操作對象的內(nèi)存空間,所以引用數(shù)據(jù)類型是通過存儲在變量處的值,也就是一個指針(point),指向存儲對象的內(nèi)存地址,從而進行訪問的。
let obj1 = new Object(); var obj2 = obj1;
當把引用類型的變量 obj1 賦給另一個變量 obj2 后,obj2 接受的其實是引用類型數(shù)據(jù)的內(nèi)存地址指針。所以,判斷兩個引用類型是否相等,其實比較的是內(nèi)存地址是否相等。
var num = 1; function foo(param) { param = 2; } foo(num); console.log(num); // num 值仍為1, 并沒有受 param = 2 賦值影響
以上代碼:
按值傳遞每次傳遞參數(shù)時,都會拷貝一份副本到函數(shù)內(nèi)部,拷貝前后的兩個值互不影響。
var obj = { num: 1 }; function foo(o) { o.num = 2; console.log(obj.num); // 2 } foo(obj); console.log(obj.num); // 2
以上代碼,foo 函數(shù)把 obj 對象作為實參,執(zhí)行完畢后把 obj 對象的 num 屬性給改變了,說明參數(shù) o 對象 和 外部變量 obj 對象是同一個對象。說好的按值傳遞呢,怎么還是把原來的對象給改變了呢。
再看下面這段代碼:
var obj = { num: 1 }; function foo(o) { o = 100; } foo(obj); console.log(obj.num); // 1
如果是按引用傳遞的話,按理來說 obj 對象會被改變會 100 才對。
準確的說,JS中的基本類型按值傳遞,對象類型按共享傳遞的(call by sharing,也叫按對象傳遞、按對象共享傳遞)
在共享傳遞中對函數(shù)形參的賦值,不會影響實參本身的值。
所以,形參引用的對象是同一個,由于對象是可變的(mutable),修改形參中對象的屬性值,會影響到原本對象的屬性值。
按引用傳遞是傳遞對象的引用,而按共享傳遞是傳遞對象的拷貝的副本,所以副本本身無法直接修改。而拷貝副本也是一種拷貝,所以也被認為是按值傳遞。
基本類型本身是按值傳遞,具有不可變性(immutable),對基本類型的修改,實質(zhì)上都是在棧內(nèi)存中創(chuàng)建了新的值。
復(fù)習鞏固:
var obj = { num : 0 }; obj.num = 100; var o = obj; o.num = 1; obj.num; // 1, 被修改 o = true; obj.num; // 1, o 是對象的一個拷貝,對 o 本身的修改,不會改變 obj 對象本身的值。
JavaScript 中參數(shù)的傳遞只有按值傳遞
,而對于引用類型的傳遞,是一種共享傳遞,傳遞的是數(shù)據(jù)類型的拷貝副本,雖然引用的是同一個對象,但是無法通過改變形參來改變實參本身。
以上就是JavaScript按值傳遞的方法,代碼示例簡單明了,如果在日常工作遇到此問題。通過這篇文章,希望你能有所收獲,更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。