ES6_Set和WeakSet_note

43 篇文章 1 订阅

该笔记部分参考

set数据结构: 本身是一种构造函数,用于生成Set数据结构

<script >
    new Set([iterable])
</script>

Set属性中有size

Set对立面的元素进行比较时,使用的算法叫做"Same-value-zero equality",类似于精确相等运算符"===",主要的区别是NaN等于自身,而精确相等运算符认为NaN不等于自身

类似于数组,但是里面不能有重复值,如:

<script >
   let arr = ['a', 'b', 'c', 'd', 'a'];
   console.log(arr);
   console.log("split---");
   // set数据结构不能重复
   let setArr = new Set(['a', 'b', 'c', 'a', 'b']);
   console.log(setArr);
</script>

set创建:

script
   let setArr = new Set();

set()可以使用 add() delete() has() 有size属性
add()方法可以连续使用(使用add方法是添加元素后创建set并返回一个新的,delete()不可以) 如:

<script >
   let setArr = new Set(['a', 'b']);
   // add()其实是添加完成之后将其返回,可以连续使用add()
   setArr.add('sdf')
   setArr.add('sdghkn')
   console.log(setArr);
   console.log("split---");
   setArr.delete('a')
   console.log(setArr);
   console.log("split---");
   console.log(setArr.has('a'));
   console.log(setArr.has('b'));
   console.log("split---");
   // size 个数
   console.log(setArr.size);
   console.log("split===");
   console.log(setArr);
   setArr.delete('sdf');
   console.log(setArr);
</script>

数组利用Set去除重复数组:

<script >
   let arr = [1, 2, 3, 4, 3, 4, 1, 5]
   console.log([...new Set(arr)])      // [1, 2, 3, 4, 5]
</script>

清除set中的所有元素:

<script >
   let setArr = new Set();
   setArr.add('a')
   setArr.add('b')
   setArr.add('c')
   console.log(setArr);
   console.log('split---');
   // 清除所有set中的数组
   setArr.clear();
   console.log(setArr);
</script>

  • Set结构可以利用 Array.from 或者 扩展运算符 转化为数组

set中添加数组会有key,value属性,可以分别使用或者一起使用,如:

<script >
   let setArr = new Set(['a', 'b', 'c', 'd']);
   // 不加keys后者value的话,默认返回的是value
   for (let item of setArr.keys()) {
       console.log(item);
   }
   console.log('split---');
   for (let item of setArr.values()) {
       console.log(item);
   }
   console.log('split---');
   for (let item of setArr.entries()) {
       console.log(item);
   }
   console.log('split---');
   for (let [key, value] of setArr.entries()) {
       console.log(key, value);
   }
   console.log('split------');

   setArr.forEach((k, v) => {
       console.log(k, v);
   })
</script>

set的应用:可以使用…将其转为数组再进行map filter操作:

<script >
   let arr = [1, 2, 3, 4, 6, 6, 5, 5, 98, 54, 45, 4, 4, 4, 4, 4,];
   // let set = new Set(arr);
   //去重,然后利用 ... 进行转为数组
   let newArray = [...new Set(arr)]
   console.log(newArray);
   /*
   使用 [] 将set数据结构变为数组
   可以使用 map filter来进行循环
   * */
</script>

set使用filter进行逻辑处理的例子:

<script >
   let set = new Set([1, 2, 3, 6, 9, 10]);
   // let set2 = new Set();
   // for (let value of set.values()) {
   //     set2.add(value * 2)
   // }
   // set = new Set([...set].map(val => val * 2));
   set = new Set([...set].filter(val => val % 2 === 0));
   console.log(set);
</script>

如果要重复在set中添加元素可以(此时仅仅是添加的对象不同):

<script >
   let set = new Set();
   let json = {
       a: 1, b: 2
   };
   let json2 = {
       a: 1, b: 2
   };
   set.add(json);
   set.add(json2);

   // console.log(set);
   set.forEach(item => {
       // console.log(item);
       console.log(item.a);
   })
</script>
  • 遍历:

keys(): 返回一个包含集合中所有键的迭代器

values():返回一个包含集合中所有值的迭代器

entries(): 返回一个包含Set对象中所有元素

forEach(callback, thisArg): 用于对集合成员执行callbackFn操作,如果提供了thisArg参数,回调中的this会是这个参数,回调中的this会是这个参数,没有返回值

Set()和WeakSet()

  • 两者区别:

WeakSet 只能储存对象引用,不能存放值,而 Set 对象都可以

WeakSet 对象中储存的对象值都是被弱引用的,则这个对象将会被垃圾回收掉(不考虑该对象还存放于 WeakSet 中),所以 WeakSet 对象里有多少个成员元素,取决于垃圾回收机制有没有运行,运行前后成员个数可能不一致,遍历结束之后,有的成员可能被垃圾回收了,WeakSet 对象是无法被遍历的(ES6 规定 WeakSet 不可遍历),也没有办法拿到它包含的所有元素

  • 属性:

    constructor: 构造函数,任何一个具有 Iterable 接口的对象,都可以作为参数
  • 方法:

    add(value): 在 WeakSet 对象中添加一个元素value

    has(value): 判断WeakSet 对象中是否包含value

    delete(value): 删除元素value

WeakSet()创建:

<script >
   let ws = new WeakSet()
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无名之辈无名之辈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值