2020年10月19日 星期一

JavaScript 傳值、傳址

     這個問題主要是做商品資料更新時候學到的作法:先開一個新陣列或物件儲存 API 傳回來的

資料,從簡易的邏輯來看,修改前跟修改後如果用的是同一筆資料,那修改之後就無法找回

修改前的資料。


    在 JavaScript 中,基本型別的比較是傳值,也就是:

var a = 100;  //number

var b = a; // 100 , number

console.log( a === b ) // 100 = 100

答案會是 true


但是在物件型別,也就是最常需要處理的商品資料中,是傳址,也稱作傳參考,例如:

var c = { price:100 }; //object

var d = { price:100 }; //object

console.log( c === d) // { price:100 } != { price:100 }

答案會是 false,這邊的思考可以想成是加了一個隱藏屬性地址,所以是

{ c , price:100 } != { d , price:100 },c 當然不等於 d ,所以是 false。


這會產生什麼需要注意的事情呢?當有兩個產品價格相同,然後你就快樂寫了

var e = { price:100 };

var f = e    //感覺省了一串

//然後 f 商品要改價格的時候

f .price = 80;

console.log(e); //80

console.log(f); //80

就會產生慘劇,延續上例,也就是 JavaScript 照著地址去把 e 的 price 屬性給改了,所以不同商品要乖乖做好預設值。


例外:function 的參數內的物件被重新賦值(x = y)的時候,外部變數的內容不受影響,但僅止於

此,若更改屬性仍然有效。


參考資料:

《0 陷阱!0 誤解!8 天重新認識 JavaScript!》Kuro Hsu 著

沒有留言:

張貼留言