在ECMAScript中,定义了下面几种基本的数据结构,分为值类型和引用类型:
值类型数据结构:
- String - 字符串
- Number - 数值(包括整型和浮点型)
- Boolean - 布尔型(true与false)
- Null - 空值
- Undefined - 未定义值
引用类型数据结构: - Object - 对象
- Array - 数组
- RegExp - 正则表达式
- Date - 日期
- Error - 错误
严格意义上,ECMAScript只有Object一种引用类型,Array、Date等都是派生于Object的子类型。
Set无序不可重复集合
语法:
const set = new Set()
const set = new Set([ 1, 2, 3 ])
操作方法 | 方法内容 |
---|---|
set.add(value) | 添加元素到集合内 |
set.delete(value) | 删除集合内指定元素 |
set.clear() | 清空集合元素 |
set.forEach(callbackFn, [, context]) | 遍历集合内所有元素,并作为第一参数调用callbackFn |
set.has(value) | 检查集合内是否含有元素 |
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方法的回调函数指定一个上下文
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
操作方法 | 方法内容 |
---|---|
map.set(key, value) | 添加键值到映射中 |
map.get(key) | 获取某个键的对应值 |
map.delete(key) | 移除某一键值对 |
map.clear() | 清空映射 |
map.entries() | 返回一个以二元数组(键值对)作为元素的类数组对象 |
map.has(key) | 检查映射中是否包含某一键值对 |
map.keys() | 返回一个以所有键作为元素的可迭代对象 |
map.values() | 返回一个所有值作为元素的可迭代对象 |
map.size | 映射的键值对的数量 |
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内部均是先利用entries()将map转换为一个类数组对象,再进行迭代
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序列化结果是标准的对象字面量形式,而Map的JSON序列化结果是以关联数组的形式表达
const str = JSON.stringify(map)
console.log(str) //=> [["foo",1],["bar",2]]
// ... 数据传输后
const otherMap = new Map(JSON.parse(str))
console.log(map.get('bar')) //=> 2