在JavaScript中,對象傳遞和賦值操作是兩個非常重要的概念。它們在日常開發中扮演著關鍵角色,但也常常會讓人感到困惑。本文將通過兩個簡單的例子,更好地理解它們的區別和實際應用。
示例代碼1:修改對象屬性
我們先來看第一段示例代碼:
let obj = {name: 'zs'
}function fn(p) {p.name = 'ls';
}fn(obj);
console.log(obj); // 輸出: { name: 'ls' }
解釋
在這段代碼中,我們創建了一個對象 obj
,并定義了一個函數 fn
。我們將 obj
傳遞給 fn
,然后在函數內部修改它的 name
屬性。最后,我們打印 obj
來查看結果。
- 對象傳遞(Pass-by-Reference): 當一個對象被傳遞給一個函數時,傳遞的是該對象的引用。這意味著函數內部的參數
p
將引用同一個對象obj
,對p
的任何修改都會反映在obj
上。因此,當p.name = 'ls'
執行時,obj
的name
屬性被修改為'ls'
。
控制臺輸出:
{ name: 'ls' }
示例代碼2:重新賦值對象
接下來,我們看看第二段示例代碼:
let obj = {name: 'zs'
}function fn(p) {p = {name: 'ls'};
}fn(obj);
console.log(obj); // 輸出: { name: 'zs' }
解釋
在這段代碼中,我們同樣創建了一個對象 obj
,并定義了一個函數 fn
。這次,我們在函數內部將 p
重新賦值為一個新的對象 { name: 'ls' }
。最后,我們打印 obj
來查看結果。
- 賦值操作: 當我們在函數內部執行
p = { name: 'ls' }
時,p
被賦值為一個新的對象引用。這意味著p
不再引用傳入的原始對象obj
,而是引用一個全新的對象{ name: 'ls' }
。然而,這個賦值操作只改變了p
的引用,并沒有改變obj
的引用。因此,obj
仍然指向原始對象{ name: 'zs' }
。
控制臺輸出:
{ name: 'zs' }
總結
通過這兩個例子,我們了解到:
- 對象傳遞:
- 當對象被傳遞給函數時,傳遞的是該對象的引用。對該引用對象的屬性修改會影響到原始對象。
- 賦值操作:
- 當函數內部對參數重新賦值時,只改變了參數的引用,不會影響到傳入的原始對象。
理解這些概念對于編寫高效、正確的JavaScript代碼至關重要。這篇文章能更好地掌握JavaScript中的對象傳遞與賦值操作。