在ECMAScript中泞边,定義了下面幾種基本的數(shù)據(jù)結(jié)構(gòu),分為值類型和引用類型:
值類型數(shù)據(jù)結(jié)構(gòu):
- String - 字符串
- Number - 數(shù)值(包括整型和浮點(diǎn)型)
- Boolean - 布爾型(true與false)
- Null - 空值
- Undefined - 未定義值
引用類型數(shù)據(jù)結(jié)構(gòu): - Object - 對象
- Array - 數(shù)組
- RegExp - 正則表達(dá)式
- Date - 日期
- Error - 錯誤
嚴(yán)格意義上裙犹,ECMAScript只有Object一種引用類型尽狠,Array、Date等都是派生于Object的子類型叶圃。
Set無序不可重復(fù)集合
語法:
const set = new Set()
const set = new Set([ 1, 2, 3 ])
操作方法 | 方法內(nèi)容 |
---|---|
set.add(value) | 添加元素到集合內(nèi) |
set.delete(value) | 刪除集合內(nèi)指定元素 |
set.clear() | 清空集合元素 |
set.forEach(callbackFn, [, context]) | 遍歷集合內(nèi)所有元素袄膏,并作為第一參數(shù)調(diào)用callbackFn |
set.has(value) | 檢查集合內(nèi)是否含有元素 |
const set = new Set()
// 添加元素
set
.add(1)
.add(2)
.add(3)
.add(3)
console.log(set) //=> Set { 1, 2, 3 }
set.has(2) //=> true
// 刪除元素
set.delete(2)
console.log(set) //=> Set { 1, 3 }
set.has(2) //=> false
// 清空集合
set.clear()
console.log(set) //=> Set {}
// 遍歷集合
const set = new Set([ 1, 2, 3, 4 ])
set.forEach(item => {
console.log(item)
})
//=>
// 1
// 2
// 3
// 4
// 還可以為集合的forEach方法的回調(diào)函數(shù)指定一個上下文
set.forEach(item => {
console.log(item * this.foo)
}, { foo: 2 })
//=>
// 2
// 4
// 6
// 8
Map映射類型
語法:
const map = new Map()
const map = new Map([ [ 'foo', 1 ], [ 'foo', 2 ] ])
console.log(map.get('foo')) //=> 2
操作方法 | 方法內(nèi)容 |
---|---|
map.set(key, value) | 添加鍵值到映射中 |
map.get(key) | 獲取某個鍵的對應(yīng)值 |
map.delete(key) | 移除某一鍵值對 |
map.clear() | 清空映射 |
map.entries() | 返回一個以二元數(shù)組(鍵值對)作為元素的類數(shù)組對象 |
map.has(key) | 檢查映射中是否包含某一鍵值對 |
map.keys() | 返回一個以所有鍵作為元素的可迭代對象 |
map.values() | 返回一個所有值作為元素的可迭代對象 |
map.size | 映射的鍵值對的數(shù)量 |
const map = new Map()
// 添加鍵值對
map.set('foo', 'Hello')
map.set('bar', 'World')
map.set('bar', 'ES2015')
// 刪除鍵值對
map.delete('foo')
// 清空
map.clear()
// 獲取
const map = new Map()
map.set('foo', 'bar')
console.log(map.get('foo')) //=> bar
// 檢查
const map = new Map([ 'foo', 1 ])
console.log(map.has('foo')) //=> true
console.log(map.has('bar')) //=> false
// 遍歷
const map = new Map([ ['foo', 1 ], [ 'bar', 2 ] ])
console.log(Array.from(map.entries())) //=> [ [ 'foo', 1 ], [ 'bar', 2 ]]
// for-of 和forEach內(nèi)部均是先利用entries()將map轉(zhuǎn)換為一個類數(shù)組對象,再進(jìn)行迭代
for(const [ key, value ] of map) {
console.log(`${key}: ${value}`)
}
//=>
// foo: 1
// bar: 2
map.forEach((value, key, map) => {
console.log(`${key}: ${value}`)
})
Map的JSON序列化
const map = new Map()
map.set('foo', 1)
map.set('bar', 2)
// Object的JSON序列化結(jié)果是標(biāo)準(zhǔn)的對象字面量形式盗似,而Map的JSON序列化結(jié)果是以關(guān)聯(lián)數(shù)組的形式表達(dá)
const str = JSON.stringify(map)
console.log(str) //=> [["foo",1],["bar",2]]
// ... 數(shù)據(jù)傳輸后
const otherMap = new Map(JSON.parse(str))
console.log(map.get('bar')) //=> 2