ES6笔记(6)-- Set、Map结构和Iterator迭代器
系列文章 -- ES6笔记系列
搞ES6的人也是够无聊,把JS弄得越来越像Java、C++,连Iterator迭代器、Set集合、Map结构都出来了,不知道说什么好...
一、简单使用
1. iterator
学过C++的人应该知道这是个迭代器对象,拥有一个指针,指向数据结构中的某个成员
JS中的iterator也有类似的功能,JS内部为一些数据结构实现了iterator迭代器的接口,让我们可以方便的使用
var [a, b, ...c] = [1, 2, 3, 4]; c // [3, 4]
如上,解构赋值以及扩展运算符的便利,多亏了内部实现的默认iterator迭代器接口,可以使用其Symbol.iterator属性获得,如
var arr = [1, 2, 3];
var it = arr[Symbol.iterator]();
it.next() // {done: false, value: 1}
it.next() // {done: false, value: 2}
it.next() // {done: false, value: 3}
it.next() // {done: true, value: undefined}
上述的iterator接口表现形式过于隐秘,在generator生成器函数中,我们可以看看比较显示的iterator接口调用:
function* showNumbers() {
yield 1;
yield 2;
yield 3;
}
var show = showNumbers();
show.next(); // {done: false, value: 1}
show.next(); // {done: false, value: 2
show.next(); // {done: true, value: 3}
通过调用next方法,实现iterator迭代器的遍历
可见结果输出是一个对象,该对象拥有done这个迭代器是否遍历完成的状态,以及当前指向项的值
看到这里,结合上述两个例子,应该知道可以通过Symbol.iterator与generator的结合,创建出一个iterator迭代器,比如:
var obj = {};
obj[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
[...obj] // [1, 2, 3]
既然只有done与value两个属性,实现起来应该不是太难,我们可以尝试实现一个基本的iterator
function myIterator(arr) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < arr.length
? {
value: arr[nextIndex++],
done: false
}
: {
value: undefined,
done: true
}
}
}
}
var it = myIterator(['one', 'two']);
it.next() // {done: false, value: "one"}
it.next() // {done: true, value: "two"}
it.next() // {done: true, value: undefined}
2. Set
Set是ES6中新引入的数据结构,它类似于数组,但是成员的值都是唯一的,没有重复的值。
可以通过实例化其构造函数,用来生成Set数据结构,通过.add()方法插入值,通过for...of循环遍历相应值
var s = new Set();
var arr = [1, 2, 2, 3];
arr.forEach(function(item) {
s.add(item);
});
for (var item of s) {
console.log(item) // 1 2 3
}
可见Set自动去除了重复的值,只插入了一个2,由此在去除数组重复值的时候,可以更方便:
var arr = [1, 2, 2, 3];
function unique(arr) {
return [...new Set(arr)];
}
unique(arr) // [1, 2, 3]
不过,要注意的是,Set判断是否重复,是使用到了全等===条件,即类型及值完全相等才摈除,不过NaN是例外
var arr = [1, 0, '', 3, false, 3, NaN, NaN];
function unique(arr) {
return [...new Set(arr)];
}
unique(arr) // [1, 0, '', 3, false, NaN]
set有一些属性和方法:
Set.prototype.constructor:构造函数,默认就是Set函数。Set.prototype.size:返回Set实例的成员总数。
add(value):添加某个值,返回Set结构本身。delete(value):删除某个值,返回一个布尔值,表示删除是否成功。has(value):返回一个布尔值,表示该值是否为Set的成员。clear():清除所有成员,没有返回值。
var s = new Set(); s.add(1).add(2).add(2); s.size // s.has(1) // true
s.has(2) // true
s.has(3) // false s.delete(2);
s.has(2) // false s.clear()
s.has(1) // false
set的一些遍历操作:
keys():返回键名的遍历器values():返回键值的遍历器entries():返回键值对的遍历器forEach():使用回调函数遍历每个成员
keys()、values()、entries()的使用
let set = new Set(['red', 'green', 'blue']);
for (let item of set.keys()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.values()) {
console.log(item);
}
// red
// green
// blue
for (let item of set.entries()) {
console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
forEach的使用
let set = new Set([1, 2, 3]);
set.forEach((value, key) => console.log(value * 2) )
//
//
//
set与数组的转换
数组转换成set结构只需要将数组加入到set构造函数参数中实例化即可
set集合转换成数组,可简单的使用扩展运算符...,也可使用Array.from()的新方法
var items = new Set([1, 2, 3, 4, 5]);
var array1 = Array.from(items); var array2 = [...items] array1 // [1, 2, 3, 4, 5]
array2 // [1, 2, 3, 4, 5]
3. Map
Map也是ES6中新引入的数据结构,它类似于Hash结构,属于键=>值对的结构,每一项值可用key=>value来表示
通过实例化构造函数生成一个map对象,再通过.set方法设置相关项的键值对,通过.get方法获取相应的键值对
var m = new Map();
var obj = {str: 'str'}; m.set(obj, 'content');
m.get(obj) // "content"
也可以直接在构造函数中加入一个数组参数,直接实例化出map对象
var map = new Map([
['name', '张三'],
['title', 'Author']
]); map.size //
map.has('name') // true
map.get('name') // '张三''
map.has('title') // true
map.get('title') // 'Author'
类似Set,Map也有一些常见的属性和方法
- size属性 返回Map结构的成员总数。
- set(key, value) 设置
key所对应的键值,然后返回整个Map结构。如果key已经有值,则键值会被更新,否则就新生成该键 - get(key) 读取
key对应的键值,如果找不到key,返回undefined。 - has(key) 返回一个布尔值,表示某个键是否在Map数据结构中
- delete(key) 删除某个键,返回true。如果删除失败,返回false
- clear() 清除所有成员,没有返回值。
类似Set,Map也有一些常见的遍历方法
keys():返回键名的遍历器。values():返回键值的遍历器。entries():返回所有成员的遍历器。forEach():遍历Map的所有成员
let map = new Map([
['F', 'no'],
['T', 'yes'],
]); for (let key of map.keys()) {
console.log(key);
}
// "F"
// "T" for (let value of map.values()) {
console.log(value);
}
// "no"
// "yes" for (let item of map.entries()) {
console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes" // 或者
for (let [key, value] of map.entries()) {
console.log(key, value);
} // 等同于使用map.entries()
for (let [key, value] of map) {
console.log(key, value);
}
Map与数组的转换
与Set一样,Map和数组直接也可以相互转换
使用扩展运算符...可以将Map转换为数组
let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']);
[...myMap]
// [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]
实例化Map构造函数时传入参数可将数组转换为Map对象
new Map([[true, 7], [{foo: 3}, ['abc']]])
// Map {true => 7, Object {foo: 3} => ['abc']}
4. WeakSet
...
5. WeakMap
...
后记:
ES6的内容实在是太多了,打算阅读相关新特性文档后做个笔记,蓦然发现经常会不耐烦
文章不知从何写起,不知如何布局文章内容结构,写完之后又觉得不够全面或者理解还未到位,每每想不再继续
写到这篇set和map,已经没啥耐心写下去了
还是好好看看其他人的总结吧,全面许多
完
ES6笔记(6)-- Set、Map结构和Iterator迭代器的更多相关文章
- ES6笔记03-Set和Map数据结构
ES6提供了新的数据结构Set.它类似于数组,但是成员的值都是唯一的,没有重复的值.Set本身是一个构造函数,用来生成Set数据结构. var s = new Set(); [2, 3, 5, 4, ...
- ES6笔记系列
ES6,即ECMAScript 6.0,ES6的第一个版本是在2015年发布的,所以又称作ECMAScript 2015 如今距ES6发布已经一年多的时间,这时候才去学,作为一个JSer,羞愧羞愧,还 ...
- ES6的新特性(14)——Iterator 和 for...of 循环
Iterator 和 for...of 循环 Iterator(遍历器)的概念 JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Ma ...
- es6笔记5^_^set、map、iterator
一.set 1.基本用法 数据结构Set类似于数组,但是成员的值都是唯一的,没有重复的值. let s = new Set(); [2,3,5,4,5,2,2].map(x => s.add(x ...
- es6学习笔记-set和map数据结构
ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. const s = new Set(); [2, 3 ...
- ES6学习:Map结构的目的和基本用法
Map结构的目的和基本用法 JavaScript的对象(Object)本质上是键值对的集合(Hash结构),但是只能用字符串作为键.这给它的使用带来了很大的限制. 1 2 3 4 5 6 7 8 ...
- js-ES6学习笔记-Set结构和Map结构
http://www.cnblogs.com/lonhon/ 1.ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set ...
- JavaScript(ES6)学习笔记-Set和Map数据结构(一)
一.Set 1.ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. , , , , ']); s; // ...
- es6笔记(6) Iterator 和 for...of循环
概要 js中的数组.对象,加上ES6中增加的Map.Set四种数据集合. Iterator提供了一种机制,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署Iterator接口,就可以完成遍 ...
随机推荐
- 计划参照mysql-proxy编写mssql-proxy
目前使用haproxy做了mssql多个读库的负载均衡,在生产环境中运行得不错. 不过,这个方案有缺点:客户端需要选择是使用读库,还是写库.这样还是不够方便,如果能够实现自动路由就更好了,即让hapr ...
- 使用NPOI读写Excel、Word
NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目. 使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 ...
- Java多线程系列--“JUC锁”05之 非公平锁
概要 前面两章分析了"公平锁的获取和释放机制",这一章开始对“非公平锁”的获取锁/释放锁的过程进行分析.内容包括:参考代码获取非公平锁(基于JDK1.7.0_40)释放非公平锁(基 ...
- Lucene系列-近实时搜索(1)
近实时搜索(near-real-time)可以搜索IndexWriter还未commit的内容,介于immediate和eventual之间,在数据比较大.更新较频繁的情况下使用.本文主要来介绍下如何 ...
- JMS确认机制
JMS中为数不多的重点就是消息的确认机制,下面分别介绍J2EE和Spring的MessageListenerContainer的确认机制 J2EE中JMS确认机制 在JMS规范中一共4种确认方式 AU ...
- Kafka与Logstash的数据采集对接 —— 看图说话,从运行机制到部署
基于Logstash跑通Kafka还是需要注意很多东西,最重要的就是理解Kafka的原理. Logstash工作原理 由于Kafka采用解耦的设计思想,并非原始的发布订阅,生产者负责产生消息,直接推送 ...
- Atitit 图像处理底色变红的解决
Atitit 图像处理底色变红的解决 1.1. 原因 ImageIO bug ,alpha通道应该在保存jpg的时候排除1 1.2. 解决,自己移除alpha通道即可1 2. Image sav ...
- iOS-ARC
1. 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更 ...
- Python下划线与命名规范
Python下划线与命名规范 先看结论,节省只想知道答案你的宝贵时间: _xxx 不能用于from module import * 以单下划线开头的表示的是protected类型的变量.即保护类型只能 ...
- KnockoutJS 3.X API 第五章 高级应用(1) 创建自定义绑定
您不仅限于使用内置的绑定,如click,value绑定等,您可以创建自己的绑定. 这是如何控制视图模型如何与DOM元素进行交互,并且为您提供了大量的灵活性,以便于以复用的方式封装复杂的行为. 注册绑定 ...