1. 程式人生 > >javascript 傳值方式

javascript 傳值方式

結論:javascript是按值傳遞的

1.基本型別的按值傳遞

javascript的基本型別傳遞的意思就是把變數的【值】拷貝一份傳遞過去,但是當前變數本身不改變。
效果:對變數的修改【不會影響到原來的變數的值】。
基本資料型別包括:Number、String 、Boolean、Null和Undefined
舉例如下:

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

    foo(value);
    console.log(value);

輸出結果:

2
1

2.引用型別的按值傳遞:修改物件屬性

引用型別按值傳遞的意思就是把當前物件的引用值拷貝一份傳遞過去(原物件和函式變數的引用都指向同一個引用),所以對物件屬性的修改就會保留下來,引用型別之所以傳遞的是物件引用值的拷貝是因為因為當值是一個複雜的資料結構的時候,拷貝就會產生效能上的問題
效果:對引用型別【屬性的修改會反映到原來物件上】。
舉例如下:

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

    foo(obj);
    console.log(obj.value);

輸出結果:

2
2

3.引用型別的按值傳遞:修改函式引數的引用

引用型別按值傳遞:傳遞的還是當前物件的【引用值】拷貝。
這個時候,如果直接修改函式變數的引用,其實修改的是哪個拷貝的引用,當然對原物件沒有任何影響了。
效果:對引數的直接修改(引用修改)【對原來物件沒有任何影響】。
舉例如下:

var obj = {
      value: 1
    };

    function foo(o) {
        o =2;
        console.log(o);
    }

    foo(obj);
    console.log(obj);
    console.log(obj.value)

輸出結果:

2
1

總結:javascript是按值傳遞的

區別在於基本型別傳遞的是具體值的拷貝,而引用型別傳遞的是引用值的拷貝,對於對引用傳遞的修改會不會影響到原來物件的屬性,就看在函式中修改的是引用本身(僅僅是引數引用指向另一個地址而已,所以對原物件沒有任何影響,這裡關鍵要理解:原物件的引用、和引數的引用其實是兩個完全獨立的引用(或者說是指標),他們的共同點就是指向到相同的記憶體地址而已),還是修改的引用值的屬性修改引數引用的屬性會影響到原物件的屬性)。

其實不僅是javascript,java也是這樣的傳值方式,其他程式語言相信也是這樣的傳值方式。