es6重点笔记:Symbol,Set,Map,Proxy,Reflect
一,Symbol
原始数据类型,不是对象,它是JavaScript第七种数据类型,表示独一无二的值。Symbol是通过Symbol函数生成的:
let s = Symbol(); typeof s
// "symbol"
不用new,因为Symbol不是对象,而是原始值。Symbol通常作为内置的值来使用,最重要的一个属性:
Symbol.iterator,该属性指向该对象的默认遍历器方法,所以
obj[Symbol.iterator]会返回该对象的默认遍历器,然后可以使用遍历器一些方法比如for...of
二,Set,Map
1,Set
类似于数组,但是成员的值都是唯一的,本身是构造函数,所以可以const s = new Set();
Set函数接收一个数组,会进行去重,但是注意返回的是Set结构,不是数组,因此要转换一下
[...new Set(array)],这就是最简单的数组去重。
Set生成的对象有size属性(实际是Set.prototype.size属性),代表里面成员个数,都是不重复的。
4个操作方法:
add(value),添加某个值,返回Set结构本身,所以可以链式使用,连续add,但是如果add都是同一个,其实只算1个
delete(value),删除某个值,返回布尔值,表示是否删除成功
has(value),返回布尔值,表示是否为Set的成员
clear(),清楚所有成员,没有返回值
4个遍历方法:
keys():返回键名的遍历器
values():返回键值的遍历器
entries():返回键值对的遍历器,entries不管是数组操作还是对象操作,还是其他操作,返回的都是['键名', '键值']这样的一个一个数组
forEach():使用回调函数遍历每个成员
返回遍历器的通常操作是for...of循环返回的遍历器
利用Set实现数组的交集,并集和差集。
let arr1 = [1,2,3];
let arr2 = [4,2,1]; let a = new Set(arr1);
let b = new Set(arr2); // 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4} // 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// Set {1, 2} // 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {3, 4}
这里要注意的点:
1,new Set只能传一个数组,在将a, b合并的时候用扩展运算符,外面要包上数组,
2,扩展运算符是适用于所有的具有iterator接口的对象,所以用a,b或者arr1,arr2都一样。
3,filter是数组方法,必须要把Set结构先转为数组结构
三,Map
JavaScript的对象本质上是键值对的集合(Hash结构),但只能用字符串作为键,而ES6提供的Map结构,类似于对象,也是键值对的集合,但是它的键不局限于字符串,各种类型的值都可以当作键,包括对象,“值-值”
cosnt m = new Map();
const o = {p: 'hello world'}; m.set(o, 'content') m.get(o) // 'content' m.has(o) // true
m.delete(o) // true
m.has(o) // false
注意:
只有对同一个对象的引用,Map结构才将其视为同一个键!因为不同对象,内存地址是不同的,具体反例:
const map = new Map(); map.set([1], 'content') map.get([1]) // undefined
Map的属性,方法和遍历方法跟Set一模一样。
四,Proxy
Proxy用于修改某些操作的默认行为,说白了,就是在目标对象前面设置一个“拦截层”,外界对该对象的访问必须先通过这层拦截,起到过滤和改写,Proxy译为代理,也就是“代理器”
构造函数Proxy接受两个参数,第一个是所要代理的目标对象,第二个是一个配置对象,里面是很多处理函数,就是对该函数拦截对应的操作。
主要的处理函数有:
get(target, propKey, receiver):拦截对象属性的读取,你只要访问对象任何属性,就会触发它
set(target, propKey, value, receiver):拦截对象属性的设置
apply(target, object, args): 拦截实例,只要将其作为函数调用的话就会触发,注意,是作为调用
construct(target, args): 拦截作为构造函数调用,就是用了new
var handler = {
get: function(target, name){
if (name === 'prototype'){
return Object.prototype;
}
return 'hello' + name
},
apply: function(target, thisBlinding, args) {
return args[0]
},
constructor: function(target, args) {
return {value: args[1]}
}
}; var fproxy = new Proxy(function(x, y){
return x+y
}, handler); fproxy(1, 2) // 1
new fproxy(1, 2) // {value: 2}
fproxy.prototype === Object.prototype // true
fproxy.foo // 'Hello, foo'
五,Reflect
Reflect对象类似于Proxy对象,设计目的:
1,将Object对象的属于语言内部的方法放到了Reflect对象上,如Object.defineProperty
2,修改某些Object方法的返回结果
3,让Object操作都变成函数行为
4,Reflect对象的方法与Proxy对象的方法一一对应
es6重点笔记:Symbol,Set,Map,Proxy,Reflect的更多相关文章
- es6重点笔记:对象
1,Object.is():比较两个值是否严格相等,es5的'===',不能判断+0和-0,还有NaN,但是es6的Object.is()可以区分 Object.is(+0, -0); // fals ...
- es6重点笔记:数值,函数和数组
本篇全是重点,捡常用的怼,数值的扩展比较少,所以和函数放一起: 一,数值 1,Number.EPSILON:用来检测浮点数的计算,如果误差小于这个,就无误 2,Math.trunc():取整,去除小数 ...
- es6学习笔记-Symbol
概述 ES5 的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制 ...
- es6重点笔记:let,const
一,let 先看代码: var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i) }; } a ...
- es6学习笔记-set和map数据结构
ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. const s = new Set(); [2, 3 ...
- ES6重点--笔记(转)
最常用的ES6特性 let, const, class, extends, super, arrow functions, template string, destructuring, defaul ...
- ES6 新增数据类型检测 Set Map Proxy
检测代码方法 function isNative(api){ return /native code/.test(api.toString())&&typeof api !== 'un ...
- es6学习笔记--新数据类型Symbol
学习了es6语法的symbol类型,整理笔记,闲时复习. Symbol 是es6新增的第七种原始数据类型(null,string,number,undefined,boolean,object),是为 ...
- ES6学习笔记(9)----Symbol
参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ Symbol1.symbol:Symbol是javascript的第七种原始数据类型,代表独一无 ...
随机推荐
- 关于 python 新式类和旧式类继承顺序的验证
参考:http://www.cnblogs.com/blackmatrix/p/5630515.html 官方:https://docs.python.org/2/tutorial/classes.h ...
- com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector APPARENT DEADLOCK
最近在IDEA中启动Tomcat经常会碰到这个错误,起初.一直没在意,现在碰到的次数多了,就去查看下这个问题,现描述如下: =2018-01-08 14:27:30,216 WARN [com.mch ...
- C#设计模式之一单例模式(Singleton Pattern)【创建型】
一.引言 看了李建忠老师的讲的设计模式已经有一段时间了(这段时间大概有一年多了),自己还没有写过自己的.有关设计模式的文章.这次想写一些关于设计模式的文章,用自己的理解和代码来写,算是复习一遍 ...
- 代码审计之XiaoCms(后台任意文件上传至getshell,任意目录删除,会话固定漏洞)
0x00 前言 这段时间就一直在搞代码审计了.针对自己的审计方法做一下总结,记录一下步骤. 审计没他,基础要牢,思路要清晰,姿势要多且正. 下面是自己审计的步骤,正在逐步调整,寻求效率最高. 0x01 ...
- ERP报错:所在的期间无效,但又无法新增账套期间。
问题: 进入2018新年月,客户在新增单据的时候,报错:日期[2018-01-03]所在的期间无效 正常解决方法 过账期间里面设置一下路径:管理----期间与结账----过账期间设置 先设置年期间-- ...
- vue 设计日历表
日历的功能,我们会经常用到,且逻辑比较复杂,小算法较多,花了半天时间写了个,特此详记. 先贴图 功能阐述:返回本月不多说,设置工作日和节假日是为了公司制度需要,后台会有假日表来记录. 为了适应于vue ...
- 数据结构之二叉树(BinaryTree)
导读 二叉树是一种很常见的数据结构,但要注意的是,二叉树并不是树的特殊情况,二叉树与树是两种不一样的数据结构. 目录 一. 二叉树的定义 二.二叉树为何不是特殊的树 三.二叉树的五种基本形态 四.二叉 ...
- mongodb 聚合查询
操作符介绍: $project:包含.排除.重命名和显示字段 $match:查询,需要同find()一样的参数 $limit:限制结果数量 $skip:忽略结果的数量 $sort:按照给定的字段排序结 ...
- List集合及新特性引用
ArrayList就是动态数组,也是一个对象. 创建一个ArrayList对象,该对象存放在堆内存中,且是一个内存连续的内存区域. 1.ArrayList是用数组实现的,这个数组的内存是连续的,不存在 ...
- 洛谷 P1028 数的计算【递推】
P1028 数的计算 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在它 ...