map,js Map数据结构,Map数据结构,es6中的Map数据结构

由来?,参数?,基本用法?

// JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。
let obj = {
    
    sex: '男'}
let kk = {
    
    }
kk[obj] = 'kk'
console.log(kk) // { '[object Object]': 'kk' }
console.log(obj.toString()) // [object Object]
console.log(kk['[object Object]']) // kk

// 为了应对以上问题 map诞生
// ES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,
// Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。

// 自我理解: 普通的对象,键就是一个具体的值,但是map的键可以是一个引用

console.log('---------------------')

// map 的set,get,has,delete方法(添加成员,删除成员)
const m = new Map()
const o = {
    
    hello: 'hello world'}
m.set(o, '你好')
m.get(o)
console.log(m.get(o))  // 你好
console.log(m.has(o)) // true
console.log(m.delete(o)) // true
console.log(m.has(o)) // false

// map也可以接受一个数组作为参数
const n = new Map([['name','this is name'],['age', 'this is age']])
console.log(n.size)  // 2
console.log(n.get('name')) // this is name
console.log(n.get('age')) // this is age
console.log(n.has('age')) //true
// map 接收一个数组未参数,实际执行的是如下的算法
const a = [['name','this is name'],['age', 'this is age']]
const b = new Map()
a.forEach(([key, value]) => {
    
    b.set(key,value)})
console.log(b.size) // 2
console.log(b.has('name')) // true
console.log(b.get('age')) //  this is age

// map可接收参数扩展:事实上,不仅仅是数组,任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构(详见《Iterator》一章)
// 都可以当作Map构造函数的参数。这就是说,Set和Map都可以用来生成新的 Map。
const c = new Set([['name', 'kate'],['sex', 'woman']])
const c1 = new Map(c)
console.log(c1.size)  // 2
console.log(c1.get('name')) // kate
console.log(c1.has('sex')) // true
const d = new Map([['name', 'kateother'],['sex', 'woman']])
const d1 = new Map(d)
console.log(d1.size) // 2
console.log(d1.get('name')) //  kateother
console.log(d1.get('sex')) // woman


// 注意(当键是对象的时候):只有对同一个对象的引用,map结构才会将其看做同一个键
const e = new Map()
e.set(['A'], 666)
console.log(e.get(['A'])) // undefined  set和get方法,表面是针对同一个键,但实际上这是两个不同的数组实例,内存地址是不一样的,因此get方法无法读取该键,返回undefined。
const e1 = ['A']
e.set(e1,'AAAAAAAAAAAAA')
console.log(e.get(e1))  // AAAAAAAAAAAAA
// Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。
// 这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名

// Map的键如果是一个简单类型的值(数字,字符串,布尔值),只要两个值严格相等,map将其视为一个键。(注意:尽管NaN不严格相等于自身,但map将其视为同一个键)
console.log(+0 === -0) // true
let f = new Map()
f.set(-0, '000')
console.log(f.get(+0)) // 000
f.set(undefined, 'uuuuuu')
f.set(null, 'nnnnnnnnnn')
console.log(f.get(undefined)) // uuuuuu
console.log(f.get(null)) // nnnnnnnnnn
f.set(NaN, 'NNNNN')
f.set(NaN, 'MMMMMMM')
console.log(f.get(NaN)) // MMMMMMM

实例的属性和操作方法

猜你喜欢

转载自blog.csdn.net/weixin_43131046/article/details/125612294
今日推荐