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