JavaScript引數按值傳遞
阿新 • • 發佈:2019-03-11
JavaScript引數按值傳遞
- ECMAScript中所有函式的引數都是按值傳遞
- 也就是說,把函式外部的值複製給函式內部的引數,就和把值從一個變數複製到另一個變數一樣。
var value = 1 function foo(value){ value = 2 console.log(value) // 2 } foo(value) console.log(value) // 1 當傳遞value到函式foo中,相當於拷貝了一份value,假設拷貝的這份叫_value,函式中修改的都是_value的值,而不會影響原來的value的值
引用傳遞?
- 如果值是一個複雜的資料結構,拷貝(值傳遞)就是產生效能影響
- 引用傳遞,就是傳遞物件的引用,函式內部對引數的任何改變都會影響原有物件的值,因為兩者引用的是統一地址。
var obj = {
value : 1
}
function foo(obj){
obj.value=2
console.log(obj.value)// 2
}
foo(obj)
console.log(obj.value)// 2
上面說了ECMAScript中所有函式的引數都是按值傳遞,怎麼能按引用傳遞成功呢
var obj = {
value : 1
}
function foo(obj){
obj = 2
console.log(obj)// 2
}
foo(obj)
console.log(obj.value)// 1
如果JavaScript採用的是引用傳遞,外層的值也會被修改。
所以修改 o.value,可以通過引用找到原值,但是直接修改 o,並不會修改原值。所以第二個和第三個例子其實都是按共享傳遞。 注意: 按引用傳遞是傳遞物件的引用,而按共享傳遞是傳遞物件的引用的副本!