在 JavaScript 和 TypeScript 中,物件不能直接相比較。所以,如果要複製物件也不能直接使用一個等號複製過去。
就在昨天學到了關於 比較 的雷區之後,今天忍不住找到了另一個雷區,就是關於物件的雷區。關於物件,如果我們把一個物件 assign 一個變數,這個變數所儲存並不是這個物件的值,而是這個物件的參考,也就是說,這兩個變數會指向同一個變數,要小心。
來看的範例吧:
let foo = [1 , 2, 3];
let bar = foo; // 這時候 bar 和 foo 都同時指向 [1, 2, 3]
// 這時候
// foo 會是 [1, 2, 3]
// bar 也是 [1, 2, 3]
foo.push(9527);
// 這時候
// foo 會是 [1, 2, 3, 9527]
// bar 也是 [1, 2, 3, 9527]
雖然我們是 push 9527
到 foo
裡面,但因為 foo
和 bar
都是指到同一個存放 [1, 2, 3]
的位置,所以不管我對 foo
做什麼事情,bar
也同時會被影響!所以要很小心!
這時候因為他們是存參考位置,所以如果我們去比較這兩個變數(foo, bar),他就會是相等的。
foo === bar // true
現在應該知道為什麼物件不能直接比了吧!這個就是跟 比較 的雷區是有相關的!
那如果要複製該怎麼做呢?可以使用 Object.create
來完成。
foo = Object.create(bar);
這樣一來, foo
與 bar
的內容就會相同,但又不會是同一個物件了。