關於javascript中的值傳遞和引用傳遞

javascript一切都是值傳遞,只不過傳遞的值是一個引用。
可能有點繞口,來看例子慢慢解釋一下。(例子來自

function changeStuff(a, b, c) {
  a = a * 10;
  b.item = "changed";
  c = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};

changeStuff(num, obj1, obj2);

console.log(num);
console.log(obj1.item);
console.log(obj2.item);

所以打印出來的是:

10
changed
unchanged

來進行幾個假設:
1. 如果js中全是值傳遞:那麼obj1不應該更改爲changed。
2. 如果js中全是引用傳遞:那麼num就應該變爲100而不是10。
3. 如果js中基礎類型是值傳遞,對象是引用傳遞:在這個假設中obj2是進行的引用傳遞,那麼我們更改了obj2的引用指向,但是在打印的時候卻發現它還是原值。
4. 如果是本文開頭的那樣,js中全部是值傳遞,只不過傳遞的值是一個引用:num是一個引用,指向了當初內存中的10,但是這個引用是以值傳遞的,所以修改這個值傳遞的參數的指向,是無法修改原引用的指向,而obj1的引用也是用值傳遞的,但是使用引用值訪問的成員卻是真正的引用,所以能更改成功。

關於這種特殊的值傳遞,wiki上有一個定義,叫做分享傳遞(call-by-share)。
希望能夠讓看到文章的人理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章