一、ES6SetMap數(shù)據(jù)結(jié)構(gòu)出現(xiàn)的意義
Map可以用任何類型作為鍵。明確保留順序。同時避免與Object優(yōu)化場景沖突,性能優(yōu)化潛力更大。Set可以輕易達(dá)到去重的目的。但更徹底的理解方式是,Set是只有鍵的Map,而不是不重復(fù)的Array。因此它可以理解為Map的語法糖,它比較的對象依然是Object,而不是Array。因此它真正的優(yōu)點(diǎn)同樣是允許用任何類型的鍵、保留順序,而不是去重。
這些用Array都能手動模擬,但問題是性能上會存在很大的問題,同時也很不方便。如果這些都不重要,那其實(shí)ES連Array都不必有了,因?yàn)橛肙bject也能模擬Array。從圖靈完備的角度來說,甚至string都不必有了,因?yàn)樗鼈兌寄苡糜肙bject模擬的Array配合number實(shí)現(xiàn)。
ES6 提供了 Map 數(shù)據(jù)結(jié)構(gòu)。它類似于對象,也是鍵值對的集合,但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當(dāng)作鍵。也就是說,Object 結(jié)構(gòu)提供了“字符串—值”的對應(yīng),Map 結(jié)構(gòu)提供了“值—值”的對應(yīng),是一種更完善的 Hash 結(jié)構(gòu)實(shí)現(xiàn)。如果你需要“鍵值對”的數(shù)據(jù)結(jié)構(gòu),Map 比 Object 更合適。
延伸閱讀:
二、Maps 和 Objects 的區(qū)別
一個 Object 的鍵只能是字符串或者 Symbols,但一個 Map 的鍵可以是任意值。Map 中的鍵值是有序的(FIFO 原則),而添加到對象中的鍵則不是。關(guān)于對象是無序的官方解釋: 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 第五版規(guī)范。因此,使用 for-in 語句遍歷對象屬性時遍歷書序并非屬性構(gòu)建順序。而 IE6 IE7 IE8 Firefox Safari 的 JavaScript 解析引擎遵循的是較老的 ECMA-262 第三版規(guī)范,屬性遍歷順序由屬性構(gòu)建的順序決定。
Map?的鍵值對個數(shù)可以從 size 屬性獲取,而?Object?的鍵值對個數(shù)只能手動計(jì)算。Object 都有自己的原型,原型鏈上的鍵名有可能和你自己在對象上的設(shè)置的鍵名產(chǎn)生沖突。