這個問題主要是做商品資料更新時候學到的作法:先開一個新陣列或物件儲存 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)的時候,外部變數的內容不受影響,但僅止於
此,若更改屬性仍然有效。
參考資料:
沒有留言:
張貼留言