1.2.3.7.觀念小叮嚀:傳值和傳參考

  • 傳值 (By value)

    • 所有純值 (primitive)都是傳值

    • 將值拷貝到不同記憶體地點

    • b = a, 將a的值複製一份到b的記憶體位置, 共兩個記憶體位置

  • 傳參考 (By reference)

    • 所有物件(Object)都是傳參考

    • 兩個變數都會參考到相同記憶體位置

    • b = a, b就如同a的別名, 僅一個記憶體位置

  • 不可改變的 (Immutable)

    //By value (primitive)
    var a = 3;
    var b;

    //By value because a is a primitive
    b = a;
    a = 2;

    //印出2
    console.log(a);
    //印出3
    console.log(b);

    //By reference (all objects, functions)
    var c = {greeting: 'hi'};
    var d;

    d = c;
    c.greeting = 'hello'; //mutate

    //印出Object {greeting: "hello"}
    console.log(c);
    //印出Object {greeting: "hello"}
    console.log(d);

    function changeGreeting(obj){
        obj.greeting = 'hola';
    }

    changeGreeting(d);
    //印出Object {greeting: "hola"}
    console.log(c);
    //印出Object {greeting: "hola"}
    console.log(d);

    //equal operator sets up new memory space (new address)
    c = {greeting: 'howdy'};
    //印出Object {greeting: "howdy"}
    console.log(c);
    //印出Object {greeting: "hola"}
    console.log(d);

Last updated