ES6之新的数据结构
来源:互联网 发布:郑州seo公司 编辑:程序博客网 时间:2024/04/30 16:26
新的数据结构
目录:
- 新的数据结构
- 无序集合 Set
- 数组与集合的区别
- 增减元素
- 检查元素
- 遍历元素
- forEach
- for-of
- WeakSet
- Map映射类型
- WeakMap
- 无序集合 Set
无序集合 Set
数组与集合的区别
用法:new Set([iterable]) : Set
const set = new Set();const set = new Set([1, 2, 3]);
增减元素
通过 add、delete 和 clear 方法来添加、删除和清空集合内的元素。
const set = new Set();// 添加元素set .add(1) .add(2) .add(3) .add(3); // 这一句并不会起到任何作用,因为元素3已存在console.log(set); // Set(3) {1, 2, 3}// 删除元素set.delete(2);console.log(set); // Set(2) {1, 3}// 清空集合set.clear();console.log(set); // Set(0) {}
检查元素
因为集合并没有排序的概念,所以集合对象并没有像数组对象那样有 indexOf 方法,也就意味着不能通过 set.indexOf(value) >= 0 的形式来检查元素是否存在于集合中。但集合对象提供了 has 方法用于检查某集合中是否包含某一个元素。
const set = new Set([1, 2, 3, 4]);//检查元素set.has(2); // trueset.has(5); // false
遍历元素
forEach
集合对象的 forEach 方法和数组类型的一样,传入一个回调函数以接受集合内的元素,并且可以为这个回调函数指定一个上下文,同样的,集合对象的 forEach 方法也是无法被中断的。
setObj.forEach(callbackfn[, thisArg])
- setObj: 必需。Set 对象。
- callbackfn: 必需。callbackfn 最多接受三个参数。对于集合中的每个元素,forEach 都会调用函数一次。
- thisArg:可选。可在 callbackfn 函数中为其引用 this 关键字的对象。如果省略 thisArg,则 undefined 将用作 this 值。
注意无法为箭头函数指定一个上下文。
function callbackfn(value, key, setObj)
const set = new Set([1, 2, 3, 4]);set.forEach(item => { console.log(item);});// 1// 2// 3// 4set.forEach(function(item){ console.log(item * this.foo);}, {foo: 2});// 2// 4// 6// 8
for-of
for-of 循环语句可以迭代可迭代对象(Iterable Object),并可以配合 const 和 let 使用,从而解决 forEach 方法不可中断的问题。
const set = new Set([1, 2, 3, 4]);for(const val of set){ console.log(val);} // 1 2 3
WeakSet
const weakset = new WeakSet();weakset.add(1); // Uncaught TypeError: Invalid value used in weak setweakset.add({foo: 1});console.log(weakset); // WeakSet {}console.log(weakset.size); // undefined
WeakSet 与 Set 不同的地方:
- WeakSet 不能包含值类型元素,否则会抛出一个 TypeError。
- WeakSet 不能包含无引用的对象,否则会自动清除出集合。
- WeakSet 无法被探知其大小,也无法被探知其中所包含的元素。
const weakset = new WeakSet();let foo = {bar: 1};weakset.add(foo);console.log(weakset.has(foo)); // truefoo = null;console.log(weakset.has(foo)); // false
实现将字符串等值类型加入到 WeakSet 数据结构中:
var ws = new WeakSet();var str = new String("Hello");var num = new Number(1);ws.add(str);ws.add(num);console.log(ws.has(str)); // trueconsole.log(ws.has(num)); // true
这种做法的弊端在于,被加入到 WeakSet 中的字符串和数字等不能被修改,因为一旦进行修改其引用便会丢失,甚至导致被移除出集合。
str += "hehe";console.log(ws.has(str)); // false
WeakSet 最大的实用意义在于,可以让我们直接对引擎中垃圾收集器的运行情况有程序化的探知方式,开发者可以利用 WeakSet 的特性以更高的定制化方案来优化程序的内存使用方案。
Map映射类型
用法:new Map([iterable]) : Map
const map = new Map();
在创建映射对象时,可以将一个以二元数组(键值对)作为元素的数组传入到构建函数中,其中每一个键值对都会加入到该映射对象中。该数组内的元素会以数组顺序进行处理,如果存在相同的键,则会按照先进先出(FIFO)原则,以该键最后一个处理的对应值为最终值。
const map = new Map([['foo', 1], ['foo', 2]]);console.log(map.get('foo')); // 2
除了语法和实现层面上的区别之外,映射对象和普通对象的区别还体现在 JSON 的序列化结果中。Object 的 JSON 序列化结果是标准的对象字面量形式,而 Map 的 JSON 序列化结果是以关联数组的形式表达。
const map = new Map();map.set('foo', 1);map.set('bar', 2);const str = JSON.stringify(map);console.log(str); // [["foo",1],["bar",2]]// ...data transportconst otherMap = new Map(JSON.parse(str));console.log(otherMap.get('bar')); // 2
WeakMap
和 WeakSet 类似,只不过 WeakMap 的键会检查变量引用,只要其中一个引用全被解除,该键值对就会被删除。
const weakmap = new WeakMap();let keyObject = {id: 1};const valObject = {score: 100};weakmap.set(keyObject, valObject);weakmap.get(keyObject); // {score: 100}keyObject = null;console.log(weakmap.has(keyObject)); // false
- ES6之新的数据结构
- ES6 -- 新的数据结构:Set和Map
- ES6-新数据结构Map
- ES6之-字符串的新特性
- JavaScript之ES6的常用新特性
- 【ES6】ES6的新特性
- ES6之SET数据结构
- ES6的新特性
- ES6的新特性
- ES6的新特性
- ES6的新特性
- ES6新增的数据结构
- ES6的Set数据结构
- ES6-新数据结构Set与WeakSet
- es6新特性-Set和Map数据结构
- ES6核心内容之新特性
- ES6新特性之promise
- es6新特性之generator
- 学习记录
- 【LeetCode 13】Roman to Integer(Python)
- RabbitMQ基础概念详细介绍
- Jetson tk1 安装OpenNI 1 +Xtion Pro +NiTE
- 泛型
- ES6之新的数据结构
- libevent学习
- 一幅图秒懂LoadAverage(负载) 转载 2015年06月25日 15:55:57 7517 转自:http://www.habadog.com/2015/02/27/what-is-load-
- linux内核编程一:模块的装载和卸载
- 插入排序之直接插入排序
- 9
- Codeforces Round #350 (Div. 2) A
- c语言知识汇总
- Rxjava1升级Rxjava2坑