ES6学习笔记(三):与迭代相关的新东东
Symbol
概念
Symbol:一种新的原始数据类型,表示独一无二的值。
注意:Symbol函数的参数只是表示对当前Symbol值的描述,因此相同参数的Symbol函数的返回值是不相等的。
// 没有参数的情况
var s1 = Symbol();
var s2 = Symbol();
s1 === s2 // false
// 有参数的情况
var s1 = Symbol("foo");
var s2 = Symbol("foo");
s1 === s2 // false
作为属性的Symbol
三种写法:
var mySymbol = Symbol();
// 第一种写法
var a = {};
a[mySymbol] = 'Hello!';
// 第二种写法
var a = {
[mySymbol]: 'Hello!'
};
// 第三种写法
var a = {};
Object.defineProperty(a, mySymbol, { value: 'Hello!' });
// 以上写法都得到同样结果
a[mySymbol] // "Hello!"
注意,Symbol值作为对象属性名时,不能用点运算符。
Symbol属性名的遍历
Object.getOwnPropertySymbols方法,可以获取指定对象的所有Symbol属性名。
Reflect.ownKeys方法可以返回所有类型的键名,包括常规键名和Symbol键名。
Symbol.for(),Symbol.keyFor()
Symbol.for(key): 返回一个命名为key的Symbol值,如果没有则创建。可使不同变量使用同一个Symbol
Symbol.keyFor(value): for的逆操作
Set和Map数据类型
Set
概念:类似数组,但是没有重复的值
初始化: new Set([1,2,3,4,4])
注意:在Set内部,两个NaN是相等。而两个空对象不相等,所以它们被视为两个值。
set的属性和方法
Set.prototype.constructor
Set.prototype.size // 获取成员总数
实例方法:
1.操作方法
add():添加某个值,返回Set结构本身。
delete():删除某个值,返回一个布尔值,表示删除是否成功。
has():返回一个布尔值,表示该值是否为Set的成员。
clear():清除所有成员,没有返回值。
2.遍历方法
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员
WeakSet
概念:也是set数据类型,但是成员只能是对象
特点:无法引用WeakSet的成员,因此WeakSet是不可遍历的
Map
概念:类似对象,但是键不限于字符串
初始化:new Map(Object or Array) Object或Array必须是形似键值对集合的
var map = new Map([['name', '张三'], ['title', 'Author']]);
map.size // 2
map.has('name') // true
map.get('name') // "张三"
map.has('title') // true
map.get('title') // "Author"
Map属性和方法:
size属性:返回Map结构的成员总数。
1.操作方法:
set(key, value):设置键值对
get(key):获取对应键的值
has(key):是否有对应键
delete(key):删除对应键
clear():清除所有成员
2.遍历方法
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器
forEach():使用回调函数遍历每个成员
需要特别注意的是,Map的遍历顺序就是插入顺序。
问题:map要使用数组的方法怎么用更方便?
let map1 = new Map(
[...map0].filter(([k, v]) => k < 3)
);
WeakMap
概念:也是Map数据类型,但是成员只能是对象
特点:键名所指向的对象,不计入垃圾回收机制
WeakMap与Map在API上的区别:
一是没有遍历操作(即没有key()、values()和entries()方法),也没有size属性;
二是无法清空,即不支持clear方法。这与WeakMap的键不被计入引用、被垃圾回收机制忽略有关。
因此,WeakMap只有四个方法可用:get()、set()、has()、delete()。
Iterator
概念:
1.适用对象:Array、Map、Set、某些类似数组的Object
2.作用
Iterator的作用有三个:
一是为各种数据结构,提供一个统一的、简便的访问接口;
二是使得数据结构的成员能够按某种次序排列;
三是ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。
凡是部署了Symbol.iterator属性的数据结构,就称为部署了遍历器接口。
一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。
调用场合
1.解构赋值
2.扩展运算符
3.yield
4.所以任何接受数组作为参数的场合,其实都调用了遍历器接口。
字符串的Iterator
for...of
遍历拥有Iterator接口的集合
适用范围:数组、Set和Map结构、某些类似数组的对象(比如arguments对象、DOM NodeList对象)、后文的Generator对象,以及字符串。
for...in循环有几个缺点:
1.数组的键名是数字,但是for...in遍历会转化成字符串
2.不止遍历自身,还会遍历原型链上的属性
3.某些情况下,会以任意顺序遍历
ES6学习笔记(三):与迭代相关的新东东的更多相关文章
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- ES6学习笔记(三)——数值的扩展
看到这条条目录有没有感觉很枯燥,觉得自己的工作中还用不到它所以实在没有耐心看下去,我也是最近得闲,逼自己静下心来去学习去总结,只有在别人浮躁的时候你能静下心来去学去看去总结,你才能进步.毕竟作为前端不 ...
- ES6学习笔记六:迭代
一:迭代器 它是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署Iterator接口,就可以完成遍历操作(即依次处理该数据结构的所有成员). ES6创造了一种新的遍历命令for. ...
- ES6学习笔记三:Symbol、Set、Map
一:Symbol ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值.它是 JavaScript 语言的第七种数据类型,前六种是:undefined.null.布尔值(Boolean). ...
- ES6学习笔记三
1.Symbol ES5 的对象属性名都是字符串,这容易造成属性名的冲突.如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突.这就是 ES6 引入Symbol的原因 ...
- ES6学习笔记三(proxy和reflect)
proxy用法 // 代理 { let obj={ time:'2017-03-11', name:'net', _r: }; let monitor=new Proxy(obj,{ // 拦截对象属 ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- ES6学习笔记<一> let const class extends super
学习参考地址1 学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...
随机推荐
- nginx下No input file specified错误的解决
在web服务的根目录下创建 .htaccess文件,设置一下内容: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond % ...
- JAVA框架Struts2 数据封装
一.strust2封装数据包含二部分: 数据在到Action类的时候,会经过拦截器,拦截器会有很多功能:比如数据封装.类型转换等. 我可以查看下strust-default.xml文件,看那些拦截器默 ...
- HTML5 <iframe> 标签
iframe 元素会创建包含另外一个文档的内联框架(即行内框架). 即页面中嵌入另外一个独立的页面使用iframe,熟悉src是嵌套的页面的路径地址,scrolling属性可以设置iframe的滚动条 ...
- Android 给CheckBox设置背景
一般来说我们给控件(Button,LinearLayout,ImageView,TextView等)设这背景的时候只需要设置这些控件的android:background即可, 但是在给CheckBo ...
- scp 免密登录ssh-copy-id 如何使用非22端口 + rsync 同步远程机器的文件到本地
其中:id_rsa为私钥文件,id_rsa.pub为公钥文件 ssh-copy-id -i ~/.ssh/id_rsa.pub "-p 2122 root@IP " 我的:s ...
- Theano3.7-练习之堆叠消噪自动编码器
来自:http://deeplearning.net/tutorial/SdA.html#sda Stacked Denoising Autoencoders (SdA) note:这部分需要读者读过 ...
- A Theoretical Analysis of Feature Pooling in Visual Recognition
这篇是10年ICML的论文,但是它是从原理上来分析池化的原因,因为池化的好坏的确会影响到结果,比如有除了最大池化和均值池化,还有随机池化等等,在eccv14中海油在顶层加个空间金字塔池化的方法.可谓多 ...
- mysql中唯一约束用法
以前比较naive,有次同事一定要在表里建唯一约束的时候,我就很纳闷为啥非要在db层面做限制,在自己的业务代码里做啊,就是说入库的时候先查一遍有没有,没有记录的情况再准许入库. 后来发现如果只是自己处 ...
- Java IO详解(七)------随机访问文件流
File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...
- vlc播放rtsp之怪事
播放源:rtsp;//admin:12345@11.11.3.24:554/Streaming/channels/201 源是一台海康的nvr,在一台win2003的服务器用vlc2.2可以播放,但在 ...