1. 程式人生 > >JavaScript引數按值傳遞

JavaScript引數按值傳遞

開發十年,就只剩下這套架構體系了! >>>   

JavaScript引數按值傳遞

  1. ECMAScript中所有函式的引數都是按值傳遞
  什麼是按值傳遞呢?
  1. 也就是說,把函式外部的值複製給函式內部的引數,就和把值從一個變數複製到另一個變數一樣。
var value = 1

function foo(value){
    value = 2
    console.log(value) // 2
}
foo(value)
console.log(value) // 1

當傳遞value到函式foo中,相當於拷貝了一份value,假設拷貝的這份叫_value,函式中修改的都是_value的值,而不會影響原來的value的值

引用傳遞?

  1. 如果值是一個複雜的資料結構,拷貝(值傳遞)就是產生效能影響
  2. 引用傳遞,就是傳遞物件的引用,函式內部對引數的任何改變都會影響原有物件的值,因為兩者引用的是統一地址。
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,並不會修改原值。所以第二個和第三個例子其實都是按共享傳遞。   注意: 按引用傳遞是傳遞物件的引用,而按共享傳遞是傳遞物件的引用的副本!
  最後,可以這樣理解: 引數如果是基本資料型別可以按值傳遞,如果是引用型別,按