最近遇到個有趣的問題:“JS中的值是按值傳遞,還是按引用傳遞呢?”
在分析這個問題之前,我們需了解什么是按值傳遞(call by value),什么是按引用傳遞(call by reference)。在計(jì)算機(jī)科學(xué)里,這個部分叫求值策略(Evaluation Strategy)。它決定變量之間、函數(shù)調(diào)用時實(shí)參和形參之間值是如何傳遞的。
按值傳遞 VS. 按引用傳遞
按值傳遞(call by value)是最常用的求值策略:函數(shù)的形參是被調(diào)用時所傳實(shí)參的副本。修改形參的值并不會影響實(shí)參。
按引用傳遞(call by reference)時,函數(shù)的形參接收實(shí)參的隱式引用,而不再是副本。這意味著函數(shù)形參的值如果被修改,實(shí)參也會被修改。同時兩者指向相同的值。
按引用傳遞會使函數(shù)調(diào)用的追蹤更加困難,有時也會引起一些微妙的BUG。
按值傳遞由于每次都需要克隆副本,對一些復(fù)雜類型,性能較低。兩種傳值方式都有各自的問題。
我們先看一個C的例子來了解按值和引用傳遞的區(qū)別: