es6语法总结
es6语法总结
let和var的区别:
(1)let申明的变量只在块级作用域中生效
(2)let变量不能重复定义
const 定义常量 常量的含义是就是不能修改的数
const使用的时候要注意两点
(1)const也是有块级作用域的
(2)const申明的时候必须赋值
补充:什么是块级作用域? 用大括号{}包起来的
2、解构赋值
简而言之:就是赋值,是左边的结构和右边的结构要一一对应 数据的类型必须要一样
举例来说对象的解构赋值
{ let a, b ({a,b}={a:1,b:2}); //左右两边的结构一一对应 }
使用结构赋值的好处
(1)变量的交换 [a,b]=[b,a]; 不需要使用中间变量
(2)函数数据的一一对应
{ function f(){ return [1,2] } let a, b [a,b]=f(); cosole.log(a, b); }
下面这个例子更好的说明了解构赋值的好处,有点绕 多看几遍 就领会了
{ let metadata={ title:’abc’, test:[{title:’test’,desc:’descrption’}] } let{title:estitle,test[{title:cntitle}]}=metadata; console.log(estitle,cntitle) }
3、正则扩展
(说实话,我怕正则扩展怕的要死 没办法 硬着头皮学吧)
es6正则扩展主要是解决匹配字符大于两个字符的时候 一个非常好的解决方法 使用{}
注意:
// #正则表达式中,点(.)是一个特殊字符,代表任意的单个字符,但是行终止符(line terminator character)除外 // u+000a 换行符(\n) // u+000d 回车符(\r) // u+2028 行分隔符(line separator) // u+2029 段分隔符(paragraph separator)
4、字符串扩展
导入兼容库
npm install babel-polyfill --save-dev (1)codepointat() includes() startswith() endwith() repeat()字符串方法 codepointat() 对这种4个字节的字符,es5不能处理,正确处理4个字节存储的字符,返回字符的一个码点 includes()是否包含某一字符串 startswith() 以什么字符串开始 endwith() 以什么字符串结束 repeat(n) 字符串重复几遍
(2) 处理日期很好用的padstart() padend() 方法
{ console.log('1'.padstart(2,'0')); //01 console.log('1'.padend(2,'0')); //10 }
(3)非常好用的标签模板(强烈推荐使用 在vue项目中也使用了这个)
使用标签模板的好处 处理xxx攻击 处理多语言转换的问题
看例子
{ let user={ name:'list', info:'hello world' } console.log( abc`i am ${user.name} ${user.info}`) function abc(s,v1,v2) { console.log(s,v1,v2) return s+v1+v2 } }
(4)raw对所有的\进行转义 使用的频率不高 了解即可
5、数值扩展
主要是一些方法的介绍
number.isfinite() //判断是不是数 返回的是布尔值 number.isnan() //判断是不是nan的值 返回的是布尔值 isinteger() //判断是不是整数 返回的是布尔值 number.max_safe_integer //这是一个常量 表示数的上线 返回的是2^53 number.min_safe_integer //这是一个常量 表示数的下线 返回的是2^(-53) number.issafeinteger() //判断这个数是不是在上线和下线范围内 如果不在的话 数据存储就不准确了 math.trunc() //判断带小数的整数部分并返回 返回小数的整数部分 math.sign() //判断一个数是正数、负数还是0 返回的是1、-1、0 math.cbrt() //立方根的计算
6、数组的扩展
array.of() 就是把数组中的元素放置其中
array.from() 把一些枚数组或者集合转换成真正的数组,并且使用数组里面的方法去遍历
copewith()方法 console.log([1,2,3,4,5].copywithin(0,3,4)); [4,2,3,4,5] //不常用
find() 查找到符合的元素就返回,只返回一个元素
findindex() 与find类似,但是返回的是元素的下标
fill()将数组所有的元素都用 填充
keys() 返回下标值 索引
let index of values() 返回内容
let values of entries() 返回全部
let [index,values] of includes() 是否包含某一元素 返回true或false
7、函数的扩展
//参数默认值 function test(x,y='world'){ console.log('默认值',x,y); } test('hello') 谨记:如果你在y,后面在加一个参数 c,这个时候c必须也要赋初始值,不然就会报错 //作用域 { let a='test' function test2(a,y=a){ console.log('作用域',a,y) }, test2('hello') //输出a和y的值都是hello } //rest参数 { function test3(...arg){ for(let v of arg){ console.log('rest',v) } } test3(1,2,3,4,'a') rest 1 rest 2 ...... } //扩展运算符 { console.log(...[1,2,3]); console.log(a,...[1,2,3]); } //箭头函数 { let arrow = v =>v*2; console.log('arrow',arrow(2)); let arrow2 = () =>5; console.log('arrow2',arrow(2)); } //尾调用 { function tail(x){ console.log('tail',x); } function fx(x){ return tail(); } fx(123) //tail 123 }
8、对象扩展
//属性表达式 { let a='b'; let es6_obj={ [a]:'c' } } //object新增方法 object.is() 相当于=== object.assign() 拷贝 object.entries()
9、symbol的用法
1、symbol 返回的是一个唯一值
2、symbol.for() //指向的是一个指针
下面这个例子很好的阐述了symbol的使用
{ let a1=symbol.for('abc'); let obj={ [a1]:'123', 'abc':345, 'c':456 }; console.log('obj',obj) for(let [keys,values] of object.entries(obj)){ console.log('let of',keys,values) } object.getownpropertysymbols(obj).foreach(function (item) { console.log(obj[item]); }) reflect.ownkeys(obj).foreach(function (item) { console.log('ownkeys',item,obj[item]) }) }
10、set—map数据结构
set new set() 定义方法 可以传参数也可以不传参数 特性:数值的唯一性 去重 set的四个方法 add delete clear has set的遍历keys() values() entries() foreach() weakset weakset和set支持的数据类型不一样 weakset的元素只能是对象 数值什么的都不行 weakset是弱引用:不和垃圾回收机制拉钩 地址的引用 不检测地址是否被垃圾回收了 没有clear方法 不能遍历 map set添加元素使用add方法 map添加元素使用set()方法 map得到数据时get()方法
//数据结构横向对比,增,查,改,删 { let map=new map(); let array=[]; //增 map.set('t',1); array.push({t:1}); console.info('map-array',map,array); //查 let map_exist=map.has('t'); let array_exist=array.find(item=>item.t); console.info('map-array-modify',map,array); //改 map.set('t',2); array.foreach(item=>item.titem.t=2:''); console.info('map-array-modify',map,array); //删 map.delete('t'); let index=array.findindex(item=>item.t); array.splice(index,1); console.info('set-array-empty',set,array); } { //map,set,object对比 let item={t:1}; let map=new map(); let set=new set(); let obj={}; //增 map.set('t',1); set.add(item); obj['t']=1; console.info('map-set-obj',obj,map,set); //查 console.info({ map_exist:map.has('t'), set_exist:set.has(item), obj_exist:'t' in obj }) //改 map.set('t',2); item.t=2; obj['t']=2; console.info('map-set-obj-modify',obj,map,set); //删除 map.delete('t'); set.delete(item); delete obj['t']; console.info('map-set-obj-empty',obj,map,set) }
11、proxy reflect
//直接上代码 就一清二楚了
{ let obj={ time:'2017-3-10', name:'net', _r:123 } let monitor =new proxy(obj,{ //拦截数据的读取 get(target,key){ return target[key].replace('2017','2018'); }, //拦截对象设置属性 set(target,key,value){ if(key==='name'){ return target[key]=value }else { return target[key] } }, //拦截key in object操作 has(target,key){ if(key==='name'){ return true }else{ return false } }, //拦截删除操作 deleteproperty(target,key){ if(key.indexof('_')>-1){ delete target[key] return true }else { return target[key] } }, //拦截object.keys object.getownpropertysymbols object.getownpropertynames ownkeys(target){ return object.keys(target).filter(item=>item!='time') } }) monitor.time='2019' monitor.name='mukewang' console.log('get',monitor.time) console.log('set',monitor.time,monitor) // console.log('has','name' in monitor,'time' in monitor) // console.log('delete',monitor) // delete monitor._r // console.log('delete',monitor) console.log(' ownkeys',object.keys(monitor)) } { let obj={ time:'2017-3-10', name:'net', _r:123 } console.log('reflect.set',reflect.set(obj,'name','mukewang')); // console.log('reflect.get',reflect.get(obj,'name')) console.log('reflect.get', reflect.get(obj,'time')); console.log('reflect.has',reflect.has(obj,'_r')) } { function validator(target,validator){ return new proxy(target,{ _validator:validator, set(target,key,value,proxy){ if(target.hasownproperty(key)){ let va=this._validator[key]; if(!!va(value)){ return reflect.set(target,key,value,proxy) }else{ throw error(`不能设置${key}到${value}`) } }else{ throw error(`${key} 不存在`) } } }) } const personvalidators={ name(val){ return typeof val==='string' }, age(val){ return typeof val === 'number' && val>18 }, mobile(val){ } } class person{ constructor(name,age){ this.name=name; this.age=age; this.mobile='1111'; return validator(this,personvalidators) } } const person=new person('lilei',30); console.info(person); person.name='han mei mei'; console.info(person); }
12、类与对象
//基本定义和生成实例 { class parent{ constructor(name='mukewang'){ this.name=name; } } let v_parent=new parent('v'); }
//继承 class child extends parent{ } //继承传递参数 { class parent{ constructor(name='pengjing'){ this.name=name; } } class child extends parent{ constructor(name='child'){ super(name); //这个必须要被放在第一行 后面的属性this. 要跟在后面 不然会报错 this.type='child' } } console.log('继承传递参数',new child()) } 静态方法依赖于类,通过类调用静态方法 实例方法依赖于类的对象,需要创建对象后 不管是静态方法还是静态属性都是直接通过类去调用 类的对象是new //静态方法 { class parent { constructor(name = 'mukewang') { this.name = name; } static tell(){ console.log('tell') } } parent.tell() //静态方法的调用 } //静态属性 { class parent { constructor(name = 'mukewang') { this.name = name; } static tell(){ console.log('tell') } } parent.type='test'; console.log('静态属性',parent.type) }
13、promise 异步请求
以前执行异步请求一般都是通过callback() 但是如果有多个异步请求的话 使用call'back()回调函数是特别复杂的
//callback回调函数的使用 { let ajax=function (callback) { console.log('执行1'); settimeout(function () { callback&&callback.call() },1000) }; ajax(function () { console.log('timeout') }) } //promise { let ajax=function () { console.log('执行2'); return new promise(function (resolve,reject) { settimeout(function () { resolve() },1000); }) }; ajax().then(function () { console.log('promise','timeout2') }) } { let ajax=function () { console.log('执行3'); return new promise(function (resolve,reject) { settimeout(function () { resolve() },1000); }) }; ajax().then(function () { return new promise(function (resolve,reject) { settimeout(function () { resolve() },2000) }) }).then(function () { console.log('timeout3') }) } //promise异常捕获 { let ajax=function (num) { console.log('执行4'); return new promise(function (resolve, reject) { if(num>5){ resolve() }else { throw new error ('出错了') } }) }; ajax(6).then(function () { console.log('log',6); }).catch(function (err) { console.log('catch',err) }); ajax(3).then(function () { console.log('log',3); }).catch(function (err) { console.log('catch',err) }); } //所有的图片都加载完在添加到页面 { function loadimg(src) { return new promise(function (resolve, reject) { let img=document.createelement("img"); img.src=src; img.onload=function () { resolve(img) } img.onerror=function () { reject(err); } }) } function showimg(imgs) { imgs.foreach(function (img) { document.body.appendchild(img); }) } promise.all([ loadimg(''), loadimg(''), loadimg('h') ]).then(showimg) } //有一个图片加载完就添加到页面 { function loadimg(src) { return new promise(function (resolve, reject) { let img=document.createelement("img"); img.src=src; img.onload=function () { resolve(img) } img.onerror=function () { reject(err); } }) } function showimgs(img) { let p=document.createelement("p"); p.appendchild(img); document.body.appendchild(p) } promise.race([ loadimg(''), loadimg(''), loadimg('') ]).then(showimgs) }
14、iterator 接口
//自定义iterator接口 { let obj={ start:[1,3,2], end:[7,9,8], [symbol.iterator](){ let self=this; let index=0; let arr=self.start.concat(self.end); let len=arr.length; return{ next(){ if(index15、generatornext函数的用法 yeild^*的用法 { let obj={}; obj[symbol.iterator]=function *() { yield "1"; yield "2"; yield "3" } for(let value of obj){ console.log('value',value) } }15、decorator 函数 修饰行为 修饰类的行为 安装插件 npm install babel-plugin-transform-decorators-legacy --save-dev 在.babelrc中写入 常规的修饰都在第三方库中,可以引入 core-decorators 可以安装 npm install core-decorators 然后通过improt引入类修饰符
{ let log=(type)=>{ return function (target,name,descriptor) { let src_method=descriptor.value; descriptor.value=(...arg)=>{ src_method.apply(target.arg); console.info(`log ${type}`) } } } class ad{ @log('show') show(){ console.log('ad is show') } @log('click') click(){ console.log('ad is click') } } let ad =new ad(); ad.show(); ad.click() }16、模块化
){>