新聞中心
這篇文章將為大家詳細講解有關ECMAScript 6.0中數(shù)據(jù)結構的介紹和使用,文章內(nèi)容質(zhì)量較高,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Set
Set
本身是一個構造函數(shù),用來生成 Set
數(shù)據(jù)結構。Set
函數(shù)可以接受一個數(shù)組(或者具有 iterable 接口的其他數(shù)據(jù)結構)作為參數(shù),用來初始化。Set
對象允許你存儲任何類型的值,無論是原始值或者是對象引用。它類似于數(shù)組,但是成員的值都是唯一的,沒有重復的值。
const s = new Set() [2, 3, 5, 4, 5, 2, 2].forEach((x) => s.add(x)) for (let i of s) { console.log(i) } // 2 3 5 4
Set 中的特殊值
Set
對象存儲的值總是唯一的,所以需要判斷兩個值是否恒等。有幾個特殊值需要特殊對待:
- +0 與 -0 在存儲判斷唯一性的時候是恒等的,所以不重復
undefined
與undefined
是恒等的,所以不重復NaN
與NaN
是不恒等的,但是在Set
中認為NaN
與NaN
相等,所有只能存在一個,不重復。
Set 的屬性:
size
:返回集合所包含元素的數(shù)量
const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]) items.size // 5
Set 實例對象的方法
add(value)
:添加某個值,返回Set
結構本身(可以鏈式調(diào)用)。delete(value)
:刪除某個值,刪除成功返回true
,否則返回false
。has(value)
:返回一個布爾值,表示該值是否為Set
的成員。clear()
:清除所有成員,沒有返回值。
s.add(1).add(2).add(2) // 注意2被加入了兩次 s.size // 2 s.has(1) // true s.has(2) // true s.has(3) // false s.delete(2) s.has(2) // false
遍歷方法
keys()
:返回鍵名的遍歷器。values()
:返回鍵值的遍歷器。entries()
:返回鍵值對的遍歷器。forEach()
:使用回調(diào)函數(shù)遍歷每個成員。
由于 Set
結構沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個值),所以 keys
方法和 values
方法的行為完全一致。
let set = new Set(['red', 'green', 'blue']) for (let item of set.keys()) { console.log(item) } // red // green // blue for (let item of set.values()) { console.log(item) } // red // green // blue for (let item of set.entries()) { console.log(item) } // ["red", "red"] // ["green", "green"] // ["blue", "blue"]
Array 和 Set 對比
Array
的indexOf
方法比Set
的has
方法效率低下Set
不含有重復值(可以利用這個特性實現(xiàn)對一個數(shù)組的去重)Set
通過delete
方法刪除某個值,而Array
只能通過splice
。兩者的使用方便程度前者更優(yōu)Array
的很多新方法map
、filter
、some
、every
等是Set
沒有的(但是通過兩者可以互相轉換來使用)
Set 的應用
1、Array.from
方法可以將 Set
結構轉為數(shù)組。
const items = new Set([1, 2, 3, 4, 5]) const array = Array.from(items)
2、數(shù)組去重
// 去除數(shù)組的重復成員 ;[...new Set(array)] Array.from(new Set(array))
3、數(shù)組的 map
和 filter
方法也可以間接用于 Set
let set = new Set([1, 2, 3]) set = new Set([...set].map((x) => x * 2)) // 返回Set結構:{2, 4, 6} let set = new Set([1, 2, 3, 4, 5]) set = new Set([...set].filter((x) => x % 2 == 0)) // 返回Set結構:{2, 4}
4、實現(xiàn)并集 (Union)
、交集 (Intersect)
和差集
let a = new Set([1, 2, 3]) let b = new Set([4, 3, 2]) // 并集 let union = new Set([...a, ...b]) // Set {1, 2, 3, 4} // 交集 let intersect = new Set([...a].filter((x) => b.has(x))) // set {2, 3} // 差集 let difference = new Set([...a].filter((x) => !b.has(x))) // Set {1}
weakSet
WeakSet
結構與 Set
類似,也是不重復的值的集合。
- 成員都是數(shù)組和類似數(shù)組的對象,若調(diào)用
add()
方法時傳入了非數(shù)組和類似數(shù)組的對象的參數(shù),就會拋出錯誤。
const b = [1, 2, [1, 2]] new WeakSet(b) // Uncaught TypeError: Invalid value used in weak set
- 成員都是弱引用,可以被垃圾回收機制回收,可以用來保存 DOM 節(jié)點,不容易造成內(nèi)存泄漏。
WeakSet
不可迭代,因此不能被用在for-of
等循環(huán)中。WeakSet
沒有size
屬性。
Map
Map
中存儲的是 key-value
形式的鍵值對, 其中的 key
和 value
可以是任何類型的, 即對象也可以作為 key
。 Map
的出現(xiàn),就是讓各種類型的值都可以當作鍵。Map
提供的是 “值-值”的對應。
Map 和 Object 的區(qū)別
Object
對象有原型, 也就是說他有默認的key
值在對象上面, 除非我們使用Object.create(null)
創(chuàng)建一個沒有原型的對象;- 在
Object
對象中, 只能把String
和Symbol
作為key
值, 但是在Map
中,key
值可以是任何基本類型(String
,Number
,Boolean
,undefined
,NaN
….),或者對象(Map
,Set
,Object
,Function
,Symbol
,null
….); - 通過
Map
中的size
屬性, 可以很方便地獲取到Map
長度, 要獲取Object
的長度, 你只能手動計算
Map 的屬性
- size: 返回集合所包含元素的數(shù)量
const map = new Map() map.set('foo', ture) map.set('bar', false) map.size // 2
Map 對象的方法
set(key, val)
: 向Map
中添加新元素get(key)
: 通過鍵值查找特定的數(shù)值并返回has(key)
: 判斷Map
對象中是否有Key
所對應的值,有返回true
,否則返回false
delete(key)
: 通過鍵值從Map
中移除對應的數(shù)據(jù)clear()
: 將這個Map
中的所有元素刪除
const m = new Map() const o = { p: 'Hello World' } m.set(o, 'content') m.get(o) // "content" m.has(o) // true m.delete(o) // true m.has(o) // false
遍歷方法
keys()
:返回鍵名的遍歷器values()
:返回鍵值的遍歷器entries()
:返回鍵值對的遍歷器forEach()
:使用回調(diào)函數(shù)遍歷每個成員
const map = new Map([ ['a', 1], ['b', 2], ]) for (let key of map.keys()) { console.log(key) } // "a" // "b" for (let value of map.values()) { console.log(value) } // 1 // 2 for (let item of map.entries()) { console.log(item) } // ["a", 1] // ["b", 2] // 或者 for (let [key, value] of map.entries()) { console.log(key, value) } // "a" 1 // "b" 2 // for...of...遍歷map等同于使用map.entries() for (let [key, value] of map) { console.log(key, value) } // "a" 1 // "b" 2
數(shù)據(jù)類型轉化
Map 轉為數(shù)組
let map = new Map() let arr = [...map]
數(shù)組轉為 Map
Map: map = new Map(arr)
Map 轉為對象
let obj = {} for (let [k, v] of map) { obj[k] = v }
對象轉為 Map
for( let k of Object.keys(obj)){ map.set(k,obj[k]) }
Map的應用
在一些 Admin 項目中我們通常都對個人信息進行展示,比如將如下信息展示到頁面上。傳統(tǒng)方法如下。
姓名 {{info.name}}
年齡 {{info.age}}
性別 {{info.sex}}
手機號 {{info.phone}}
家庭住址 {{info.address}}
家庭住址 {{info.duty}}
js 代碼
mounted() { this.info = { name: 'jack', sex: '男', age: '28', phone: '13888888888', address: '廣東省廣州市', duty: '總經(jīng)理' } }
我們通過 Map 來改造,將我們需要顯示的 label 和 value 存到我們的 Map 后渲染到頁面,這樣減少了大量的html代碼
{{label}} {{value}}
js 代碼
data: () => ({ info: {}, infoMap: {} }), mounted () { this.info = { name: 'jack', sex: '男', age: '28', phone: '13888888888', address: '廣東省廣州市', duty: '總經(jīng)理' } const mapKeys = ['姓名', '性別', '年齡', '電話', '家庭地址', '身份'] const result = new Map() let i = 0 for (const key in this.info) { result.set(mapKeys[i], this.info[key]) i++ } this.infoMap = result }
WeakMap
WeakMap
結構與 Map
結構類似,也是用于生成鍵值對的集合。
- 只接受對象作為鍵名(
null
除外),不接受其他類型的值作為鍵名 - 鍵名是弱引用,鍵值可以是任意的,鍵名所指向的對象可以被垃圾回收,此時鍵名是無效的
- 不能遍歷,方法有
get
、set
、has
、delete
總結
Set
- 是一種叫做集合的數(shù)據(jù)結構(ES6新增的)
- 成員唯一、無序且不重復
[value, value]
,鍵值與鍵名是一致的(或者說只有鍵值,沒有鍵名)- 允許儲存任何類型的唯一值,無論是原始值或者是對象引用
- 可以遍歷,方法有:
add
、delete
、has
、clear
WeakSet
- 成員都是對象
- 成員都是弱引用,可以被垃圾回收機制回收,可以用來保存
DOM
節(jié)點,不容易造成內(nèi)存泄漏 - 不能遍歷,方法有
add
、delete
、has
Map
- 是一種類似于字典的數(shù)據(jù)結構,本質(zhì)上是鍵值對的集合
- 可以遍歷,可以跟各種數(shù)據(jù)格式轉換
- 操作方法有:
set
、get
、has
、delete
、clear
WeakMap
- 只接受對象作為鍵名(
null
除外),不接受其他類型的值作為鍵名 - 鍵名是弱引用,鍵值可以是任意的,鍵名所指向的對象可以被垃圾回收,此時鍵名是無效的
不能遍歷,方法有
get
、set
、has
、delete
以上就是ECMAScript 6.0中數(shù)據(jù)結構的介紹和使用,看完之后是否有所收獲呢?如果想了解更多相關內(nèi)容,歡迎關注創(chuàng)新互聯(lián)成都網(wǎng)站設計公司行業(yè)資訊,感謝各位的閱讀。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
名稱欄目:ECMAScript6.0中數(shù)據(jù)結構的介紹和使用-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://www.dlmjj.cn/article/jchod.html