"參考"是什麼

// 原始物件
const hero = {
  id: 1,
  name: 'Iron Man',
  type: ['Technology']  // 這是一個陣列
};

// 使用淺拷貝
const heroCopy = { ...hero };

當我們進行淺拷貝時:

  1. idname 會被完整複製,因為它們是簡單的值(數字和字串)

  2. 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