JavaScript中參數之“共享傳遞”、“按值傳遞”、“按引用傳遞”

#定義

在《JavaScript高級程序設計》第三版4.1.3,講到傳遞參數:

ECMAScript中所有函數的參數都是按值傳遞的。
什麼是按值傳遞呢?

也就是說,把函數外部的值複製給函數內部的參數,就和把值從一個變量複製到另一個變量一樣。

#按值傳遞
在像參數傳遞基本類型的值時,被傳遞的值會被複制給一個局部變量(即命名參數)

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

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


引用傳遞

在像參數傳遞引用類型的值時,會把這個值得內存中的地址複製給一個局部變量,因此這個局部變量的變化會反映在函數的外部。
(即按引用傳遞,就是傳遞對象的引用,函數內部對參數的任何改變都會影響該對象的值,因爲兩者引用的是同一個對象。)

var obj = {
    value: 1
};
function foo(o) {
    o.value = 2;
    console.log(o.value); //2
}
foo(obj);
console.log(obj.value) // 2

看,這就是引用傳遞,o的變化反映到了obj這個對象上

#共享傳遞

我的理解是,參數是對象的值,也是把這個值的內存中的地址複製給一個局部變量。如果把這個局部變量重新賦值一個對象,就相當於改變了指向並獨立,與原來的對象不會再存在關係了,所以這個改變不會反應到函數外部。

var obj = {
    value: 1
};
function foo(o) {
    o = 2;
    console.log(o); //2
}
foo(obj);
console.log(obj.value) // 1
var obj = {
	value: 1
};
function foo(o) {
    o = {
    	value:3
    };
}
foo(obj);
console.log(obj.value) // 1

看,這就是共享傳遞,改變引用參數的值不會影響到外部。

#傳值還是傳引用或共享

function changeStuff(num, obj1, obj2)
{
    num = num * 10;
    obj1.item = "changed";
    obj2 = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num);   // 10
console.log(obj1.item);    // changed
console.log(obj2.item);    // unchanged
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章