前端学习(五十二) JavaScript-KeyedCollection(javaScript)

主要是Map和weakMap,Set和WeakSet

Map

是ES6中新定义的对象,和Object一样是一个键值的集合

new Map([iterable])新建一个Map对象,参数iterable是一个由键值对数组组成的参数

var a=new Map([
    ['tee','net'],
    ['hoodie','net']
])
console.log(a)   //输出了map对象
console.log(a.constructor);  //输出了map构造函数

这边Map里键值key不能重复,如果重复了那么后面的会覆盖前面的,例如有两个tee,那么后面一个tee的会覆盖到前面一个去,并且值为后面一个

Map和Obejct的区别

Object Map
键值只能是字符串或者Symbols 键值可以使任意值
需要通过for....in语句手动获得键值对个数 可以通过size属性获得键值对个数

Map的原型方法

Map.prototype.set(key,value)

设置Map对象中键的值,返回该Map对象,key就是要设置的名称,如果map中没有,那么会新增一个,如果有那么就是会修改其值为value

var a=new Map([
    ['tee','net'],
    ['hoodie','net'],
    ['asd','n123et']
])
a.set("tee","test")
console.log(a);   //输出会将tee的值改为test

Map.prototype.get(key)

返回键对应的值,如果不存在,则返回Underfined,key为键名

var a=new Map([
    ['tee','net'],
    ['hoodie','net'],
    ['asd','n123et']
])
console.log(a.get("tee"))  //输出net
console.log(a.get("ddd"))  //undefined

Map.prototype.has(key)

返回一个布尔值,表示Map实例中是否包含键对应的值,key为键名

var a=new Map([
    ['tee','net'],
    ['hoodie','net'],
    ['asd','n123et']
])
console.log(a.has("tee"))  //true
console.log(a.has("ddd"))  //false

Map.prototype.delete(key)

移除任何与键相关联的值,并返回该值,key为键名

var b=new Map([
    ['tee','net'],
    ['hoodie','net'],
    ['asd','n123et']
])
console.log(b.delete("aaa"))    //false
console.log(b.delete("tee"))    //true
console.log(b)  //返回了Map对象b,但是tee没有了

Map.prototype.clear()

移除Map对象的所有键/值

var c=new Map([
    ['tee','net'],
    ['hoodie','net'],
    ['asd','n123et']
])
console.log(c.clear())    //undefined
console.log(c)  //空对象

Map.prototype.entries()

返回一个新的iterator对象,它按插入顺序包含了Map对象中每个元素的[key,value]数组

var d=new Map([
    ['tee','net'],
    ['hoodie','net'],
    ['asd','n123et']
])
console.log(d.entries())    //MapIterator {"tee" => "net", "hoodie" => "net", "asd" => "n123et"}
console.log(d)  //Map(3) {"tee" => "net", "hoodie" => "net", "asd" => "n123et"}

个人理解差不多就是新建了一个iterator对象,然后将原来对象中的内容复制按顺序到新对象里

Map.prototype.forEach(callbcakFn[,thisArg])

按插入顺序,为Map对象里的每一键值对调用一次回调函数

callbackFn:要处理的函数,函数有三个参数value,key,Map

  • value:元素的值
  • key:元素的键
  • Map:当前正在遍历的对象

thisArg:执行forEach时的用于this的值,可选

var f=new Map([
    ['tee','nettee'],
    ['hoodie','nethoo'],
    ['asd','n123et']
])
var con={
    val:function (value) {
        return value+1
    },
    out:function (value,key) {
        console.log(this.val(value))  //输出:nettee1,nethoo1,n123et1
    }
}
f.forEach(con.out,con)

Map.prototype.keys()

返回一个新的iterator对象,它按插入数序包含了Map对象中每个元素的键也就是key

var e=new Map([
    ['tee','net'],
    ['hoodie','net'],
    ['asd','n123et']
])
console.log(e.keys())    //MapIterator {"tee", "hoodie", "asd"}
console.log(e)  //Map(3) {"tee" => "net", "hoodie" => "net", "asd" => "n123et"}

Map.prototype.values()

返回一个新的iterator对象,它按插入数序包含了Map对象中每个元素的值,也就是value

var g=new Map([
    ['tee','net'],
    ['hoodie','net'],
    ['asd','n123et']
])
console.log(g.values())    //MapIterator {"net", "net", "n123et"}
console.log(g)  //Map(3) {"tee" => "net", "hoodie" => "net", "asd" => "n123et"}

WeakMap

WeakMap也是一个键值对的集合,但是其中的键是弱引用的,这意味着,如果没有其他引用和该键引用同一个对象,这个对象将会被当作垃圾回收,键必须是对象,值可以是任意的

构造WeakMap对象

new WeakMap(iterable)

var a={a:1};
var weak=new WeakMap([
    [a,"123"]
])
console.log(weak) //返回一个WeakMap对象
console.log(weak.constructor)   //输出weak构造函数

WeakMap和Map的区别

WeakMap Map
键名只能是对象 键名可以是任意值
键名所指的对象,不计入垃圾回收机制 计入垃圾回收机制
键名是非枚举 键名可以枚举

WeakMap原型方法

WeakMap.prototype.set(key,value)

设置WeakMap对象中键的值,返回该WeakMap对象,key就是要设置的对象名称,如果这个对象不存在,那么会报错,如果对象存在且WeakMap中没有,那么会新增一个,如果有那么就是会修改其值为value

var a={a:1};
var b={b:1};
var weak=new WeakMap([
    [a,"123"]
])
console.log(weak.set(b,"999"))    //新增一个b,这个b必须是定义过的,不存在会报错
console.log(weak.set(a,"999"))    //修改对象a的值

WeakMap.prototype.get(key)

返回键对应的值,注意这边的b必须是定义过的,如果b没有定义过且又不存在对象中则会报错,key为键名

    var a={a:1};
    var b={};
    var weak=new WeakMap([
        [a,"123"],
    ])

    console.log(weak.get(b));  //返回undefined

WeakMap.prototype.has(key)

返回一个布尔值,表示Map实例中是否包含键对应的值,key为键名

    var a={a:1};
    var b={};
    var weak=new WeakMap([
        [a,"123"],
    ])

    console.log(weak.has(b));  /false

WeakMap.prototype.delete(key)

移除任何与键相关联的值,并返回该值,key为键名

    var a={a:1};
    var b={};
    var weak=new WeakMap([
        [a,"123"],
    ])

    console.log(weak.delete(b));
    console.log(weak);
console.log(b)  //返回了Map对象b,但是tee没有了

用WeakMap的好处就是不会出现内存泄漏,内存泄漏还没有讲,待理解后再来补齐这边的文档

Set

Set是ES6中新增的一个数据结构,它类似于数组,但是成员值都是唯一的

创建

new Set([iterable])

  • 可以按照插入的顺序迭代它的元素
  • Set结构不会添加重复的值
var a=new Set([1,2,3,4,5,5])
console.log(a)    //输出:1,2,3,4,5,重复的不显示

set的原型方法

Set.prototype.add(value)

在set对象的尾部添加一个元素,返回该Set对象

Set.prototype.has(value)

返回一个布尔值,表示该值在Set中存在与否

Set.prototype.delete(value)

移除Set中与这个值相等的元素

Set.prototype.clear()

移除Set对象内所有元素

Set.prototype.entries()

返回一个新的迭代器对象,该对象包含了Set对象中插入顺序排列的所有元素的值的[key,value]数组

Set.prototype.forEach(回调函数[,thisArg])

按照插入栓需,为Set对象中的每一个值调用一次回调函数

Set.rpototype.values()

返回一个新的迭代器对象,包含了Set对象中的按插入顺序排列元素的所有元素的值

Set.pototype.keys()

返回一个新的迭代器对象,包含了Set对象中的按插入顺序排列元素的所有元素的key

WeakSet

和set类似,是不重复值的集合

创建

new WeakSet([iterable])

var ex={}
var a=new WeakSet([ex])
WeakSet set
键名只能是对象 键名可以是任意值
键名所指向的对象,不进入垃圾回收机制 计入垃圾回收机智

原型方法

WeakSet.prototype.add(value)

在WeakSet对象的尾部添加一个元素,返回该Set对象

WeakSet.prototype.has(value)

返回一个布尔值,表示该值在Set中存在与否

WeakSet.prototype.delete(value)

移除WeakSet中与这个值相等的元素

WeakSet.prototype.clear()

移除WeakSet对象内所有元素

猜你喜欢

转载自blog.csdn.net/zy21131437/article/details/81259063
今日推荐