<值傳遞參數(shù)概述>JavaScript中的參數(shù)傳遞方式有兩種:值傳遞和引用傳遞。值傳遞是指將實(shí)參的值復(fù)制到形參中,形參的改變對(duì)實(shí)參不會(huì)產(chǎn)生影響。引用傳遞是指將實(shí)參的地址傳遞到形參中,形參和實(shí)參指向同一個(gè)地址,形參改變會(huì)影響實(shí)參。
function Animal(name, age) { this.name = name; this.age = age; } function changeAnimal(animal) { animal.name = 'Tom'; animal.age = 2; } var cat = new Animal('Kitty', 1); console.log(cat); // {name: "Kitty", age: 1} changeAnimal(cat); console.log(cat); // {name: "Tom", age: 2}
上面的示例中,我們定義了一個(gè)Animal構(gòu)造函數(shù),用于創(chuàng)建一個(gè)動(dòng)物對(duì)象,對(duì)象有姓名和年齡兩個(gè)屬性,然后我們定義了一個(gè)changeAnimal函數(shù),用于修改動(dòng)物對(duì)象信息。最后在控制臺(tái)上輸出結(jié)果,可以看到cat對(duì)象的姓名和年齡已經(jīng)被修改。顯然,在changeAnimal函數(shù)中,我們傳入的是動(dòng)物對(duì)象的引用,因此函數(shù)中的修改會(huì)影響到傳入的對(duì)象。
<對(duì)比值傳遞和引用傳遞>為了更好地理解值傳遞和引用傳遞之間的區(qū)別,我們?cè)倏匆粋€(gè)通過(guò)值傳遞方式來(lái)傳遞對(duì)象的例子:
function changeAnimalValue(animal) { animal = { name: 'Tom', age: 2 }; } var cat = { name: 'Kitty', age: 1 }; console.log(cat); // {name: "Kitty", age: 1} changeAnimalValue(cat); console.log(cat); // {name: "Kitty", age: 1}
在上面的示例中,我們定義了一個(gè)changeAnimalValue函數(shù),用于創(chuàng)建一個(gè)新的動(dòng)物對(duì)象,并將引用修改為新對(duì)象的引用。我們認(rèn)為這個(gè)過(guò)程中會(huì)修改cat對(duì)象,但事實(shí)并非如此。執(zhí)行函數(shù)后,我們打印cat對(duì)象,發(fā)現(xiàn)cat對(duì)象沒(méi)有被修改,這是因?yàn)楹瘮?shù)傳遞的是值,而不是引用。當(dāng)我們將cat對(duì)象傳遞到函數(shù)中時(shí),形參animal將形成一個(gè)新的變量,它只是將cat對(duì)象的復(fù)制放入其中。如果函數(shù)內(nèi)對(duì)animal對(duì)象進(jìn)行修改,不會(huì)影響到原始cat對(duì)象。 這樣,我們就理解了JavaScript對(duì)象值傳遞參數(shù)的相關(guān)知識(shí),并通過(guò)舉例說(shuō)明,幫助讀者更好地理解它。在日常開(kāi)發(fā)中,我們應(yīng)該根據(jù)具體情況來(lái)選擇何時(shí)使用值傳遞和何時(shí)使用引用傳遞。