js 函數(shù)參數(shù)賦值問(wèn)題解決
一、參數(shù)傳遞機(jī)制
JavaScript 中,函數(shù)參數(shù)傳遞方式是值傳遞,但根據(jù)參數(shù)類型不同,行為表現(xiàn)不同:
基本類型(如 Number、String):傳遞的是值的副本,修改參數(shù)不影響外部。
引用類型(如 Object、Array):傳遞的是對(duì)象引用的副本,修改屬性會(huì)影響外部,但重新賦值參數(shù)不會(huì)。
二、基本類型參數(shù)(不可變)
function modifyPrimitive(num) {
num = 100; // 修改本地副本
}
let x = 5;
modifyPrimitive(x);
console.log(x); // 輸出:5(未被修改)
關(guān)鍵點(diǎn):參數(shù)是原始值的副本,函數(shù)內(nèi)修改不影響外部變量。
三、引用類型參數(shù)(可變)
- 修改屬性 → 影響外部
function modifyObject(obj) {
obj.name = 'Bob'; // 通過(guò)引用修改原對(duì)象
}
let person = { name: 'Alice' };
modifyObject(person);
console.log(person.name); // 輸出:Bob(外部被修改)
- 重新賦值參數(shù) → 不影響外部
function replaceObject(obj) {
obj = { name: 'Charlie' }; // 創(chuàng)建新對(duì)象,參數(shù)指向新地址
}
let person = { name: 'Alice' };
replaceObject(person);
console.log(person.name); // 輸出:Alice(未被修改)
- 數(shù)組示例
function modifyArray(arr) {
arr.push(4); // ? 修改原數(shù)組
arr = [5, 6, 7]; // ? 重新賦值,不影響外部
}
let numbers = [1, 2, 3];
modifyArray(numbers);
console.log(numbers); // 輸出:[1, 2, 3, 4]
四、參數(shù)賦值 vs 屬性修改
操作類型 對(duì)外部的影響 示例
修改基本類型參數(shù) ? 不影響外部 function(x) { x = 10; }
修改引用類型的屬性 ? 影響外部 function(obj) { obj.key = 1; }
重新賦值引用類型參數(shù) ? 不影響外部 function(obj) { obj = {}; }
例子:
在 forEach 中,回調(diào)函數(shù)的參數(shù) item 本質(zhì)上是數(shù)組元素的值或引用的副本。因此:
基本類型元素:item 是值的副本,重新賦值不影響原數(shù)組。
引用類型元素:item 是引用的副本,重新賦值只會(huì)改變副本的指向,不會(huì)影響原數(shù)組中的引用。
示例分析
1. 基本類型數(shù)組(重新賦值無(wú)效)
const arr = [1, 2, 3];
arr.forEach((item) => {
item = item * 10; // 修改的是副本,不影響原數(shù)組
});
console.log(arr); // 輸出:[1, 2, 3]
原因:item 是原始值 1、2、3 的副本,重新賦值不會(huì)影響原數(shù)組元素。
- 引用類型數(shù)組(修改屬性有效,重新賦值無(wú)效)
const arr = [{ value: 1 }, { value: 2 }];
// 修改屬性 → 有效
arr.forEach((item) => {
item.value = item.value * 10; // 通過(guò)引用修改原對(duì)象
});
console.log(arr); // 輸出:[{ value: 10 }, { value: 20 }]
// 重新賦值 → 無(wú)效
arr.forEach((item) => {
item = { value: 100 }; // 創(chuàng)建新對(duì)象,副本指向新對(duì)象,原數(shù)組不變
});
console.log(arr); // 輸出:[{ value: 10 }, { value: 20 }]
關(guān)鍵點(diǎn):
修改屬性:item 和原數(shù)組元素指向同一對(duì)象,修改屬性會(huì)影響原數(shù)組。
重新賦值:item 被賦予新引用,與原數(shù)組元素的引用斷開(kāi),不影響原數(shù)組。
以上就是js 函數(shù)參數(shù)賦值問(wèn)題解決的詳細(xì)內(nèi)容,更多關(guān)于js 函數(shù)參數(shù)賦值的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JavaScript前后端數(shù)據(jù)交互工具ajax使用教程
Ajax(Asynchronous?Javascript?And?XML),即是異步的JavaScript和XML,Ajax其實(shí)就是瀏覽器與服務(wù)器之間的一種異步通信方式2022-10-10
如何用JS實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)監(jiān)聽(tīng)
這篇文章主要介紹了如何用JS實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)監(jiān)聽(tīng),對(duì)數(shù)據(jù)監(jiān)聽(tīng)感興趣的同學(xué),可以參考一下2021-05-05
js時(shí)間轉(zhuǎn)換毫秒的實(shí)例代碼
在本篇文章里小編給大家整理的是關(guān)于js時(shí)間轉(zhuǎn)換毫秒的實(shí)例代碼以及相關(guān)知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。2019-08-08
JavaScript 錯(cuò)誤處理與調(diào)試經(jīng)驗(yàn)總結(jié)
在Web開(kāi)發(fā)過(guò)程中,編寫(xiě)JavaScript程序時(shí)或多或少會(huì)遇到各種各樣的錯(cuò)誤,有語(yǔ)法錯(cuò)誤,邏輯錯(cuò)誤。如果是一小段代碼,可以通過(guò)仔細(xì)檢查來(lái)排除錯(cuò)誤,但如果程序稍微復(fù)雜點(diǎn),調(diào)試JS便成為一個(gè)令Web開(kāi)發(fā)者很頭痛的問(wèn)題。2010-08-08
Openlayers實(shí)現(xiàn)擴(kuò)散的動(dòng)態(tài)點(diǎn)(水紋效果)
這篇文章主要為大家詳細(xì)介紹了Openlayers實(shí)現(xiàn)擴(kuò)散的動(dòng)態(tài)點(diǎn),水紋效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08
javascript實(shí)現(xiàn)全角轉(zhuǎn)半角的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)全角轉(zhuǎn)半角的方法,涉及JavaScript字符串遍歷與編碼轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下2016-01-01
javascript計(jì)算星座屬相(十二生肖屬相)示例代碼
本文介紹了使用javascript計(jì)算星座和屬相的示例,這個(gè)可以用在用戶注冊(cè)的時(shí)候顯示出來(lái),大家參考使用吧2014-01-01

