欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 前端技术 > javascript >内容正文

javascript

javascript的map和weakmap -ag凯发k8国际

发布时间:2023/10/18 javascript 155 如意码农
ag凯发k8国际 收集整理的这篇文章主要介绍了 javascript的map和weakmap 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

map

map的键/值可以是任何类型

基本api

初始化映射

//使用new关键字和map构造函数进行初始化
const m1 = new map(); //使用嵌套数组初始化映射
const m2 = new map([
['k1', 'v1'],
['k2', 'v2'],
['k3', 'v3']
]); // 使用自定义迭代器初始化
const m3 = new map({
[symbol.iterator]:function*() {
yield ['k1', 'v1'];
yield ["k2", "v1"];
yield ["k3", "v3"];
}
})

map的方法:set()get()has()delete()clear()

map的属性:size

m2.set('k4', 'v4');
console.log(m2.has('k4'));//true
console.log(m2.get('k4'));//v4
m2.delete('k4');
console.log(m2.has("k4")); //false
console.log(m2.get("k4"));//undefined
m2.clear();
console.log(m2.has('k1'));//false

set()返回映射实例,于是我们可以链式调用set():

m2.set('k4','v4')
.set('k5','v5');

map的键的相等比较

键的比较基于零值相等(samevaluezero),它认为 0与-0、nan与nan是相等的,其他的所有键通过===来比较相等性。

m2.set(nan, 1);
m2.set(nan,2);
console.log(m2.get(nan));//2 m2.set(-0, 3);
console.log(m2.get( 0));//3

map和object的比较

object也可以用来完成映射的作用,那选map还是object呢?

从以下方面决策:

  1. 内存占用:object和map在不同浏览器上的实现有差异,但是都会随着键值对增加占用内存线性增长,同时在给定相同的内存情况下,map能比object多存储50%的键值对。
  2. 插入性能:map的插入比object稍微好一点儿。
  3. 查找速度:如果代码涉及大量查找操作,那么选择object会更好。
  4. 删除性能:如果代码涉及大量删除操作,那么选择map会更好。
  5. 迭代:map实现了迭代协议,object没有。
  6. size:map的键值对数量可以通过size属性轻松获得,而object只能手动计算。
  7. 序列化和解析:map没有序列化和解析支持。

可以实现map的序列化和解析:how do you json.stringify an es6 map?

function replacer(key, value) {
if (value instanceof map) {
return {
datatype: "map",
value: array.from(value.entries()), // or with spread: value: [...value]
};
}
return value;
}
function reviver(key, value) {
if (typeof value === "object" && value !== null) {
if (value.datatype === "map") {
return new map(value.value);
}
}
return value;
}
const originalvalue = new map([["a", 1]]);
const str = json.stringify(originalvalue, replacer);
const newvalue = json.parse(str, reviver);
console.log(originalvalue, newvalue);

weakmap

weakmap称为弱映射。"弱"指的是内存回收机制对待weakmap中键的方式。

基本api

弱映射的键只能是对象类型(object或继承自object)。值类型无限制。

方法和属性的名称和map相同,除了没有clear()。

弱键

weakmap中的键不是正式的引用,不会阻止垃圾回收。只要键存在,键值对就会存在于映射中。

const wm = new weakmap();
wm.set({}, 'v1');

wm新建的键值对的键对象没有被引用,所以垃圾回收机制会回收它。

const wm = new weakmap();
let obj = new object();
wm.set(obj, 'v1');
console.log(wm.has(obj));//true
obj = null;
console.log(wm.has(obj));//false

不可迭代键

weakmap没有提供迭代键值对的功能,也没有必要,是为了保证只有通过键对象的引用才能取得值。

弱映射的实际使用

私有变量

以对象实例为键,以私有成员的字典为值。

const wm = new weakmap();
class user{
constructor(id) {
this.userid = symbol('id');
this.setid(id);
}
setid(id) {
const privatemembers = wm.get(this) || {};
privatemembers[this.userid] = id;
wm.set(this, privatemembers);
}
getid() {
return wm.get(this)[this.userid];
}
}
const user = new user(1);
console.log(user.getid());//1
user.setid(2);
console.log(user.getid());//2

上面的变量userid并非真正私有,通过弱映射vm可以获取:

console.log(wm.get(user)[user.userid]);//2

我们可以把弱映射和类放在一个闭包里:

const user = (() => {
const wm = new weakmap();
class user {
constructor(id) {
this.userid = symbol("id");
this.setid(id);
}
setid(id) {
const privatemembers = wm.get(this) || {};
privatemembers[this.userid] = id;
wm.set(this, privatemembers);
}
getid() {
return wm.get(this)[this.userid];
}
}
return user;
})();
const user = new user(1);
console.log(user.getid());//1
user.setid(2);
console.log(user.getid());//2

总结

以上是ag凯发k8国际为你收集整理的javascript的map和weakmap的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

  • 上一篇:
  • 下一篇:
网站地图