首页 > 其他分享 >UES-07-Set 和 Map

UES-07-Set 和 Map

时间:2024-05-17 20:41:39浏览次数:18  
标签:Map set 07 对象 Weak Set let

之前的 Set 和 Map

对象模拟 Set:

let obj = Object.create(null); // 创建的对象原型为 null
obj.v = true;
if (obj.v) // 判断值是否存在

模拟 Map:

let obj = Object.create(null);
obj.key = "value";
let v = obj.key; // "value"

变通方法问题

对象使用的任何类型的属性(键)实际上都会转换成对应的字符串类型作为键。

in 运算符根据某个属性是否存在于对象中返回 true 或 false,该运算符会搜索对象的原型。

Set

Set 的创建

let set = new Set();
set.add(1);
set.add("1");
set.size; // 2

let o1 = {},
    o2 = {};
set.add([o1, o2]);
set.size; // 3,数组中重复元素去除

let s1 = new Set();
s1.add(o1);
s1.add(o2);
s1.size; // 2

has(v) 判断传入的值是否存在于 Set 中,返回对应的布尔值。
delete(v) 从 Set 中删除指定值。
clear() 清空 Set 中所有的值。

forEach() 方法接收一个回调函数和一个可选的 this。回调函数有三个参数:第一个和第二个参数都表示 Set 中的元素,第三个参数表示 Set 本身。如果想在回调函数中使用 this, 则需要将 this 作为 forEach() 方法的第二个参数传入。当回调函数是箭头函数时,直接使用 this,不需要以任何方式传入到 forEach() 方法中。

使用扩展运算符可以将 Set 转换成数组。

let s = new Set([1,2]);
let arr = [...s]; // [1, 2]

WeakSet 只能存储对象的弱引用,不能存储基本类型值。弱引用表示如果对象仅存在弱引用这一个引用时,不会阻止垃圾回收器回收该对象,也就是某种意义上相当于该对象不存在引用了。

let s = new WeakSet(),
    k = {};
s.add(k);
s.has(k); // true

s.delete(k);
s.has(k); // false

k = null; // 此时对象没有强引用了,该对象会从 WeakSet 中移除。

WeakSet 的特点:

  • add() 方法传入非对象参数时会报错
  • 不可迭代
  • 没有 forEach() 方法
  • 没有 size 属性。

Map

Map 是存储键值对的有序列表。其中,键、值都可以为任意类型,键的类型不会自动发生转换。

let m = new Map();
let k1 = {};
let k2 = {};
m.set("k", "v");
m.set(k1, 1);
m.set(k2, true);

m.get("k"); // "v"
m.get(k1);  // 1
m.get(k2);  // true
m.get(a);   // undefined

has() 方法判断指定键是否在 Map 中。
delete() 方法删除指定键及其关联的值。
clear() 清空 Map 中所有的键值对。
size 属性存储 Map 中当前的键值对数量。

使用数组初始化 Map 时,该数组中的元素必须是长度为 2 的数组,其中第一个值作为键,第二个值作为键对应的值。

forEach() 方法接收一个回调函数和一个可选的 this。回调函数有三个参数,第一个参数表示值,第二个参数表示值对应的键,第三个参数表示 Map 本身。迭代的次序是添加到 Map 中的先后次序。

Weak Map 中的键必须是对象,这个引用是弱引用,而键对应的值不是。键对象没有强引用时,该键及其对应的值都会从 Weak Map 中移除。

Weak Map 是以键值对作为元素的无序列表,键必须是非空对象,而值可以为任意类型。Weak Map 使用数组初始化的方式与 Map 一样。
Weak Map 与 Map 相比,没有 clear() 方法,没有 size 属性。
Weak Map 的弱引用对象可以很好地做到对象销毁时,私有数据也会随之销毁。

let Per = (function() {
  let privateData = new WeakMap();

  function Per(name) {
    privateData.set(this, {name: name});
  }

  Per.prototype.getName = function() {
    return privateData.get(this).name;
  };

  return Per;
}());

只允许键的类型为对象类型时,使用 Weak Map;否则使用 Map。另外,如果想使用 Weak Map 没有提供的方法,那只能使用 Map。

参考

[1] Zakas, Understanding ECMAScript 6, 2017.

标签:Map,set,07,对象,Weak,Set,let
From: https://www.cnblogs.com/xdreamc/p/16535984.html

相关文章

  • obsidian_plugins_settings
    settingsAdmonitionstitle:settingexample代码块类型:ad-{type}type对应表|Type|Aliases||---|---||note|note,seealso||abstract|abstract,summary,tldr||info|info,todo||tip|tip,hint,important||success|success,check,done||question|question,......
  • vuejs3.0 从入门到精通——vite+vue3+ts 显示找不到模块“../views/HomeView.vue”或
    vite+vue3+ts显示找不到模块“../views/HomeView.vue”或其相应的类型声明。ts(2307)一、在根目录下的env.d.ts文件(没有就自己创建)二、在env.d.ts文件中添加以下代码declaremodule'*.vue'{importtype{DefineComponent}from'vue'constcomponent:DefineCo......
  • 076、行路难
    076、行路难唐●李白金樽清酒斗十千,玉盘珍羞直万钱。停杯投箸不能食,拔剑四顾心茫然。欲渡黄河冰塞川,将登太行雪满山。闲来垂钓碧溪上,忽复乘舟梦日边。行路难,行路难,多歧路,今安在。长风破浪会有时,直挂云帆济沧海。 【现代诗意译】金杯里盛满了美酒,斗酒价值万钱啊,玉盘里......
  • [Javascript] Object.groupBy & Map.groupBy
    ArrayGrouping isthenewfeatureofJavaScript/ECMAScript,whichsplitsanarray(or,generally,aniterable),intosmallersub-arrays.GroupingisdifferentthanotherJSarraymethods-it's not apartofthearrayprototype,butastaticmethod.......
  • ABP 框架 AutoMapper 映射实体时提示 Unmapped members were found 缺少 FullAuditedE
    在配置MapperProfile的时候, 运行提示映射出错:对于Workflow->WorkflowDto和CreateUpdateWorkflowDto->Workflow的映射,存在没有映射的属性 IsDeleted,DeleterId,DeletionTime,LastModificationTime,LastModifierId,CreationTime和CreatorId。我之前写代码都没有映射这......
  • ASP.NET Core Web中使用AutoMapper进行对象映射
    前言在日常开发中,我们常常需要将一个对象映射到另一个对象,这个过程中可能需要编写大量的重复性代码,如果每次都手动编写,不仅会影响开发效率,而且当项目越来越复杂、庞大的时候还容易出现错误。为了解决这个问题,对象映射库就随之而出了,这些库可以自动完成对象之间的映射,从而减少大量......
  • 通过mybatisflex获取多数据源mapper
    基于mybatisflex1.8.4:@NoArgsConstructor(access=AccessLevel.PRIVATE)@Slf4jpublicclassDataSource{publicstaticfinalStringA="a";publicstaticfinalStringB="b";publicstaticfinalStringC="c";pub......
  • hashMap寻址算法
    hashMap寻址算法计算对象的hashCode()。再进行调用hash()方法进行二次哈希,hashcode值右移16位再异或运算,让哈希分布更为均匀。最后(capacity-1)&hash得到索引。为何HashMap的数组长度一定是2的次幂计算索引时效率更高:如果是2的n次幂可以使用位与运算代替取模。扩容时......
  • mybatis-plus mapper整理
    mybatis-plusmapper整理简介提供了操作数据的框架,避免使用jdbc操作数据,加速开发效率,支持多种数据库(databaseId)。既支持sql,mapper的编写,也支持注解@Select等,同时提供了一二级缓存,以及BaseMapper接口以及IService、ServiceImpl这些接口,来提供模板化的方法。同时还支持逆向工程生......
  • HashMap扩容原理
    在添加元素或初始化的时候需要调用resize方法进行扩容,第一次添加数据初始化数组长度为16,以后每次每次扩容都是达到了扩容阈值(数组长度*0.75)。每次扩容的时候,都是扩容之前容量的2倍。扩容之后,会新创建一个数组,需要把老数组中的数据挪动到新的数组中。没有hash冲突的节点,则直......