一、ES6SetMap數據結構出現的意義
Map可以用任何類型作為鍵。明確保留順序。同時避免與Object優化場景沖突,性能優化潛力更大。Set可以輕易達到去重的目的。但更徹底的理解方式是,Set是只有鍵的Map,而不是不重復的Array。因此它可以理解為Map的語法糖,它比較的對象依然是Object,而不是Array。因此它真正的優點同樣是允許用任何類型的鍵、保留順序,而不是去重。
這些用Array都能手動模擬,但問題是性能上會存在很大的問題,同時也很不方便。如果這些都不重要,那其實ES連Array都不必有了,因為用Object也能模擬Array。從圖靈完備的角度來說,甚至string都不必有了,因為它們都能用用Object模擬的Array配合number實現。
ES6 提供了 Map 數據結構。它類似于對象,也是鍵值對的集合,但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當作鍵。也就是說,Object 結構提供了“字符串—值”的對應,Map 結構提供了“值—值”的對應,是一種更完善的 Hash 結構實現。如果你需要“鍵值對”的數據結構,Map 比 Object 更合適。
延伸閱讀:
二、Maps 和 Objects 的區別
一個 Object 的鍵只能是字符串或者 Symbols,但一個 Map 的鍵可以是任意值。Map 中的鍵值是有序的(FIFO 原則),而添加到對象中的鍵則不是。關于對象是無序的官方解釋: 1.An object is a member of the type Object. It is an unordered collection of properties each of which contains a primitive value, object, or function. A function stored in a property of an object is called a method. 2.Chrome Opera 的 JavaScript 解析引擎遵循的是新版 ECMA-262 第五版規范。因此,使用 for-in 語句遍歷對象屬性時遍歷書序并非屬性構建順序。而 IE6 IE7 IE8 Firefox Safari 的 JavaScript 解析引擎遵循的是較老的 ECMA-262 第三版規范,屬性遍歷順序由屬性構建的順序決定。
Map?的鍵值對個數可以從 size 屬性獲取,而?Object?的鍵值對個數只能手動計算。Object 都有自己的原型,原型鏈上的鍵名有可能和你自己在對象上的設置的鍵名產生沖突。