"參考"是什麼
// 原始物件
const hero = {
id: 1,
name: 'Iron Man',
type: ['Technology'] // 這是一個陣列
};
// 使用淺拷貝
const heroCopy = { ...hero };
當我們進行淺拷貝時:
id
和name
會被完整複製,因為它們是簡單的值(數字和字串)type
陣列不會被複製,而是建立一個指向原始陣列的"參考"(像是捷徑或指標)
這意味著:
// 修改簡單值沒問題,不會影響原物件
heroCopy.name = 'Tony Stark';
console.log(hero.name); // 'Iron Man'
console.log(heroCopy.name); // 'Tony Stark'
// 但修改陣列會影響原物件,因為兩者參考同一個陣列
heroCopy.type.push('Flight');
console.log(hero.type); // ['Technology', 'Flight']
console.log(heroCopy.type); // ['Technology', 'Flight']
可以想像成:
name
是完全獨立的兩個值,各自存在不同的地方type
則像是兩個捷徑,都指向同一個陣列,所以無論從哪個捷徑修改陣列,都會影響到另一個
想像一下 Google 共用文件:
當你複製一個文件的連結(這就是"參考"),不管多少人通過這個連結打開文件,大家看到和編輯的都是同一份文件
如果有人做了修改,所有人都會看到這個改變,因為大家都是通過連結指向同一份文件
相對的,如果你用"建立副本"(這就是"深拷貝"):
每個人都有自己獨立的文件副本
修改自己的副本不會影響到別人的文件
這就是為什麼在程式中,當我們需要獨立修改資料而不影響原始資料時,需要用深拷貝而不是參考。
Last updated