Map & Set

Map

  1. 鍵值對(Key-Value Pairs): Map 是一個集合,其中每個元素都是一個鍵值對。鍵(key)可以是任何類型(包括物件和基本類型),值(value)也可以是任何類型。
  1. 順序: Map 中的元素是有序的。元素會按照它們被添加到 Map 中的順序來保存。
  1. 迭代: Map 有多種方法和屬性來迭代或操作集合,包括 keys(), values(), 和 entries()
  1. 繼承: Map 不繼承自 JavaScript 的 Object,因此它的鍵不會和 Object 原型上的鍵發生衝突。
不會繼承的重點:使用物件使用toString時,一般物件會先查找toString這個鍵,如果找不到才會往上查找prototype.toString。因此,一般物件不應使用toString作為鍵,否則會覆蓋掉原本的toString函式。
範例來解釋不繼承自 JavaScript 的 Object意思。

使用 Object:

使用 Map:

然而在使用 Map 的例子中,即使我們添加了一個名為 'toString' 的鍵,它也不會影響到原型上的 toString 方法,因為 Map 不是從 Object.prototype 繼承來的。
在使用 Object 的例子中,我們添加了一個鍵 'toString',這會覆蓋掉從 Object.prototype 繼承的 toString 方法。這可能會導致意外行為。
這就是為什麼說 Map 較為適合用來做純粹的鍵值存儲,它不會有由於繼承自 Object.prototype 而來的這種問題

Set

  1. 僅值(Values): Set 是一個集合,其中的每個元素都是唯一的值(不是鍵值對)。值可以是任何類型。
  1. 順序: Set 中的元素也是有序的。但因為它沒有鍵來與值配對,所以這通常是不太重要的。
  1. 迭代: Set 也有方法和屬性來迭代或操作集合,但相對較少。它有一個 values() 方法,但因為 Set 是由唯一值組成的,所以它也有一個 keys() 方法,實際上與 values() 方法等價。
  1. 不支持鍵值查找: 因為 Set 只存儲值(而不是鍵值對),所以你不能像在 Map 中那樣通過鍵來查找或獲取一個值。

共同點

  1. 唯一性: Map 的鍵和 Set 的值都是唯一的。你不能在同一個 Map 中有重複的鍵,也不能在同一個 Set 中有重複的值。
  1. 動態大小: 兩者都可以在運行時動態地添加或刪除元素。
  1. 高效性能: 兩者都提供了高效的添加、刪除和查找操作。
  1. 可迭代性: 兩者都是可迭代的,你可以使用 for...of 循環或其他迭代方法(例如 forEach)來迭代它們。
  1. 內置方法: 兩者都有一系列的內置方法來進行各種操作,例如 add, delete, has, get, set 等。
  1. 任意類型的鍵或值: 兩者都可以儲存各種類型的值(包括 Object)。對於 Map,這也適用於鍵。
根據你的需求,你可以選擇使用 MapSet。如果你需要儲存鍵值對並進行高效的鍵值查找,則 Map 可能是更好的選擇。如果你只需要一個值的集合並要求集合中的值是唯一的,則 Set 是更好的選擇。