ES6学习笔记——Set和Map数据结构

156 阅读3分钟

学习笔记根据阮一峰《ES6标准入门(第3版)》整理,笔记中如有问题欢迎指正~

--------------------------------------------------------------------------------------

一、Set——没有重复元素的类数组数据结构

1. 基本用法

(1)创建方式

const s=new Set()  

(2)可以接受一个数组为参数,返回Set结构,其成员内的值唯一

const s=new Set([1,5,8,8,9,86]) // s是一个length为5的Set结构

(3)可以利用拓展运算符'...'将Set类型的数据转化为数组

let arr=[...s]  //此时的arr返回一个数组

2. Set实例的方法

(1)操作数据方法

s.add(value) //添加某个值,返回Set结构本身
s.delete(value) //删除某个值,返回布尔值,表示是否成功
s.has(value) //判断Set实例中是否存在某个值,返回布尔值
s.clear() //清除所有成员,没有返回值

 (2)遍历方法

  •  s.keys()、s.values()、s.entries()

在Set结构中没有键名,只有键值,因此s.keys()和s.values()方法的行为一致

let set = new Set([1, 2, 3, 8])        for (let item of set.keys()) {            console.log(item);        }//1
//2
//3
//8

let set = new Set([1, 2, 3, 8])        for (let item of set.values()) {            console.log(item);        }
//1
//2
//3
//8

由于Set数据结构中的键值和键名相同,所以用s.entries()返回的两个成员相等

let set = new Set([1, 2, 3, 8])        for (let item of set.entries()) {            console.log(item);        }//[1, 1]
//[2, 2]
//[3, 3]
//[8, 8]
  • s.forEach()

接受的第一个参数是处理函数,第二个可选的参数是可选的函数执行上下文中的作用阈对象

处理参数可以接受三个值,item:表示数组的每个元素、index:表示数组的索引、array:表示数组本身。

let set = new Set([1, 2, 3]);        set.forEach(function (item) {            console.log(item * 2);        })
//2
//4
//6

二、Map——  类似于对象,是键值对的集合,不限制键的形式

1. 与对象的区别

  • 对象的键局限于字符串。提供了“字符串——值”的对应,而Map结构提供了“值——值”的对应,是更完善的Hash实现,如果需要“键值对”的数据,用Map比用Object合适。

2. 基本用法

(1)创建方式

const m=new Map() //构造函数

(2)Map构造函数得参数可以接受任何一个具有Iterator接口且每个成员都是一个双元素数组的数据结构。(Set对象和Map对象作为Map构造函数的参数,都可以生成新的Map对象)

const map=new Map()
const o={p:'Hello World'}

map.set(o,'content')
map.get(o) //'content'

map.has(o)  //true   
map.delete(o) //true
map.has(o)   //false

(3)注意事项

  • 若对同一个键多次赋值,后面的值将覆盖前面的值

    const m=new Map() m.set(1,'value1') .set(1,'value2')

    m.get(1) //'value2'

  • 只有对同一对象的引用,Map结构才将其视为一个键。

    const m=new Map()

    m.set(['a'],555) m.get(['a']) //undefined

  • 只有当两个值严格相等时,Map结构将其视为两个键。所以即使两个同样的值的实例在Map中被视为两个键。

    const m=new Map()

    const k1=['a'] const k2=['a']

    map.set(k1,111) .set(k2,222)

    map.get(k1) //111 map.get(k2) //222

3. 实例属性及方法

(1)实例属性及方法

  • size属性,返回的是Map结构的成员总数

  • set方法,返回的是映射实例,可以设置Map结构的键值对,可以连续操作:set(key,value)

    const m=new Map()
    m.set('key1','value1')
     .set('key2','value2')
    
  • get方法,返回的是获取的某键的值:

    m.get('key1')   //'value1'
    m.get('key2')   //'value2'
    
  • has方法,返回布尔值

    m.has('key1')   //true
    m.has('key2')   //true
    m.has('key3')   //false
    
  • delete方法,返回布尔值,若成功删除,则返回true,否则返回false

    m.delete('key1')  //true
    
  • clear方法,不返回任何值,直接将Map结构中的数据清除

(2)遍历方法(具有类数组结构,用法与数组类似)

  • keys()
  • values()
  • entries()
  • forEach()