ES6新特性:Javascript中Set和WeakSet类型的数据结构
2016-05-12 00:38
806 查看
ES6提供了新的数据结构Set,Set对象不是数组, 可以用来保存对象或者基本类型, 所有保存的值都是唯一的, chrome浏览器>38和FF>13,以及nodeJS,对Set支持良好, 以下的一些代码,都可以拷贝到控制台直接运行哦;
或者这样:
可以看到,以上重复的4,在set里面只保存了一个, 所以Set对象可以用来给数组去重;
Set也能用来保存NaN和undefined, 如果有重复的NaN, Set会认为就一个NaN(实际上NaN!=NaN);
实例Set以后的对象拥有这些属性和方法:
属性
Set.prototype
Set.prototype.size
方法
Set.prototype.add()
Set.prototype.clear()
Set.prototype.delete()
Set.prototype.entries()
Set.prototype.forEach()
Set.prototype.has()
Set.prototype.values()
Set.prototype[@@iterator]()
Set这种类型的数据结构其实我们可以直接用数组模拟出来, 虽然不能和原生的比, 只能模拟以上列表的一些方法和属性( 还有一些功能无法实现的 , Set实例的[Symbol.species]指向自己, 但是chrome中没有[Symbol.species]这个玩意儿.... )
View Code
Set的实际用处:
利用set可以方便的进行交集和并集:
求并集, 我们可以给两个方案或者更多:
这种获取交集的方式,和数组求交集差不多;
以下这种代码更短,太酷了啊, 这个方法来自:http://es6.ruanyifeng.com/#docs/set-map;
WeakSet对象的方法只有三个,而且WeakSet对象没有size属性;
weakSet.add();
weakSet.delete();
weakSet.has();
如果对象不存在引用, 那么WeakSet对象会把没有引用的对象占用的内存回收, 下面这个demo,你可以跑一下, 然后过一会儿(我的chrome浏览器10S就看到效果了)再看控制台:
weakSet可以用来保存DOM节点, 当节点被删除, weakSet里面的该节点如果不存在别的引用的话, 一段时间内会被内存回收;
ruanyifeng:http://es6.ruanyifeng.com/#docs/set-map
作者: NONO
出处:http://www.cnblogs.com/diligenceday/
QQ:287101329
微信:18101055830
创建Set实例的基本方法为:
let set = new Set(); //或者 new Set(null); console.log(set);
或者这样:
let set = new Set([1,2,3,4,4,4,4,4]); console.log( Array.from(set) ); //输出:[ 1, 2, 3, 4 ]
可以看到,以上重复的4,在set里面只保存了一个, 所以Set对象可以用来给数组去重;
Set也能用来保存NaN和undefined, 如果有重复的NaN, Set会认为就一个NaN(实际上NaN!=NaN);
实例Set以后的对象拥有这些属性和方法:
属性
Set.prototype
Set.prototype.size
方法
Set.prototype.add()
Set.prototype.clear()
Set.prototype.delete()
Set.prototype.entries()
Set.prototype.forEach()
Set.prototype.has()
Set.prototype.values()
Set.prototype[@@iterator]()
Set这种类型的数据结构其实我们可以直接用数组模拟出来, 虽然不能和原生的比, 只能模拟以上列表的一些方法和属性( 还有一些功能无法实现的 , Set实例的[Symbol.species]指向自己, 但是chrome中没有[Symbol.species]这个玩意儿.... )
使用数组模拟一个Set构造器:
var mySet = new Set(); //往mySet里面添加数据, 1 , 5 mySet.add(1); mySet.add(5); mySet.add("some text"); //添加对象 var o = {a: 1, b: 2}; mySet.add(o); mySet.has(1); // 返回:true mySet.has(3); // 返回:false mySet.has(5); // 返回:true mySet.has(Math.sqrt(25)); // 返回:true mySet.has("Some Text".toLowerCase()); // t返回:rue mySet.has(o); // 返回:true mySet.size; // 4 mySet.delete(5); // 从mySet里面删除5 mySet.has(5); // 输出:false, 5 已经被删除了 mySet.size; // 现在的长度为:3 // 通过 for...or循环获取数据; // 输出: 1, "some text" for (let item of mySet) console.log(item); // 输出: 1, "some text" for (let item of mySet.keys()) console.log(item); // 输出: 1, "some text" for (let item of mySet.values()) console.log(item); // 输出: 1, "some text", 对于Set来说:key和value是一样的 for (let [key, value] of mySet.entries()) console.log(key); // 把迭代器转化为数组的第一种方式; var myArr = [v for (v of mySet)]; // [1, "some text"] // 把迭代器转化为数组的第二种方式; var myArr = Array.from(mySet); // [1, "some text"] // 也可以用next()方法,手动去获取每一个值;
View Code
Set的实际用处:
利用set可以方便的进行交集和并集:
求并集, 我们可以给两个方案或者更多:
var union = (setA, setB) => { //[...setA]这种方式目前只有babel才支持 return new Seet([...setA,...setB]); }; var union = (setA, setB) => { return new Set(Array.from(setA).concat(Array.from(setB))); }
这种获取交集的方式,和数组求交集差不多;
var intersect = (set1, set2) => { //return [x for (x of set1) if (set2.has(x))]; 这种写法完全不行嘛.... var resultSet = new Set(); for(let set of set1) { if(set2.has(set)) { resultSet.add(set); }; }; return resultSet; };
以下这种代码更短,太酷了啊, 这个方法来自:http://es6.ruanyifeng.com/#docs/set-map;
var intersect = (set1, set2) => { return new Set([...set1].filter(x => set2.has(x))); } console.log(intersect(new Set([1,2,3,4]), new Set([2,3,4,5]))); //输出:Set {2,3,4}
弱引用的WeakSet
WeakSet对象是一些对象值的集合, 并且其中的每个对象值都只能出现一次,WeakSet只能存对象类型的元素,比如:Object, Array, Function 等等;有了弱引用的WeakSet, 就不用担心内存泄漏了,如果别的对象不引用该对象, 这个对象会被垃圾回收机制自动回收;<script> console.log(new WeakSet([{},[],()=>({1:1})])); </script>
WeakSet对象的方法只有三个,而且WeakSet对象没有size属性;
weakSet.add();
weakSet.delete();
weakSet.has();
如果对象不存在引用, 那么WeakSet对象会把没有引用的对象占用的内存回收, 下面这个demo,你可以跑一下, 然后过一会儿(我的chrome浏览器10S就看到效果了)再看控制台:
<script> var ws = new WeakSet() var obj = {}; ws.add(obj); ws.add([]) setInterval(()=>{ console.log(ws); },1000) </script>
weakSet可以用来保存DOM节点, 当节点被删除, weakSet里面的该节点如果不存在别的引用的话, 一段时间内会被内存回收;
参考:
MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Setruanyifeng:http://es6.ruanyifeng.com/#docs/set-map
作者: NONO
出处:http://www.cnblogs.com/diligenceday/
QQ:287101329
微信:18101055830
相关文章推荐
- 数据结构 笔记5 多维数据与广义表
- 第7周 数据结构与算法分析 2-11 高效率取幂运算
- 共同学习Java源代码--数据结构--AbstractList抽象类(六)
- 第7周 数据结构与算法分析 2-8求最大子序列的函数
- 进程相关的数据结构
- 拓扑排序
- java数据结构-HashMap
- linux内核数据结构之链表
- hdu 2647 拓扑排序变形
- hdu 1285 拓扑排序 入门
- hadoop基于文件的数据结构
- 数据结构实验之链表六:有序链表的建立
- 数据结构笔记--栈的总结及java数组实现简单栈结构
- 算法与数据结构(1),List
- 算法与数据结构(2),Map
- 算法与数据结构(3),并发结构
- 图的深度优先遍历(用邻接矩阵表示图)
- 合并两个已经排序的链表
- 数据结构JavaScript描述——列表(一)
- 求链表的倒数第k个节点