2019-07-23 15:36:13 2019浏览
对于HTML5大家已经相当的熟悉了,下面我们来谈谈ES6语法,关于ES6语法扣丁学堂HTML5培训小编整理了一些,本篇文章我们先来了解一下吧。
var、let和const
var是之前就有的了,在这里提出来主要是为了比较其和let与const。
区别
1、块级作用域
for(vari=0;i<3;i++){ setTimeout(()=>{ console.log(i);//输出3个3 },0) }
for(leti=0;i<3;i++){ setTimeout(()=>{ console.log(i);//输出0,1,2 },0) }
console.log(a);//undefined vara=100;
var命令会发生变量提升现象,即变量可以在声明之前使用,值为undefined;而let纠正了这种行为,不能产生变量提升。
console.log(a);//报错 leta=100;
只要块级作用域内,存在let命令,它所声明的变量就绑定(binding)在这个区域,不再受外部影响。
如:
vartemp=123; if(true){ temp='abc';//引入错误 lettemp; }
在看一个隐晦的例子:
functionbar(x=y,y=2){ return[x,y] } bar();//报错
可以修正如下:
functionbar(y=2,x=y){ return[x,y]; } bar();//[2,2]
4、不可重复声明
vara=100; vara=1000; console.log(a);//1000
leta=100; leta=1000;//报重复声明错误
5、ES6声明的变量不会挂在顶层对象
所以目前JavaScript有六种声明变量的方式了~
varjob='teacher'; console.log(window.job);//teacher
letjob='teacher'; console.log(window.job);//undefined
const命令注意点
1、let可以先声明稍后赋值;而const声明之后必须立马赋值,否则会报错
leta; a=100;//thisisok
consta;//报没初始化数据的错误
2、const声明了简单的数据类型就不能更改了;声明了引用类型(数组,对象等),指针指向的地址不能更改,但是内部的数据可以更改的
conststr='thisisastring'; str='thisisanotherstring';//报了个“给不变的变量分配值”的错误
constobj={ name:'jia' } obj.name='ming';//thisisok obj={};//报了个“给不变的变量分配值”的错误
let和const的使用场景
2、const使用场景:常量、声明匿名函数、箭头函数的时候。
//常量 constPI=3.14; //匿名函数 constfn1=function(){ //dosomething } //箭头函数 constfn2=()=>{ //dosomething }
变量的解构赋值
解构可以理解就是一个作用:简化你变量赋值的操作。
数组场景
let[name,job]=['jiaming','teacher']; console.log(name);//jiaming
本质上,这种写法属于模式匹配,只要等号两边的模式相同(重点),左边的变量就会被赋予对应的值。再比如:
let[,,third]=["foo","bar","baz"]; console.log(third);//"baz" let[head,body,...tail]=[1,2,3,4,5]; console.log(tail);//[3,4,5]
也可以使用默认值。但是默认值生效的前提是:ES6内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效。
let[x,y='b']=['a'];//x='a',y='b' let[z=1]=[undefined]; console.log(z);//1 let[k=1]=[null]; console.log(k);//null
对象场景
conststate={ name:'jiaming', job:'teacher' }; let{ name, job }=state; //上面的场景很熟悉吧 console.log(job);//teacher
上面的例子如果写具体的话,是这样的:
conststate={ name:'jiaming', job:'teacher' }; let{ name:name,//第一个name是匹配模式,第二个name才是变量,两者同名简化成一个即可 job:job }=state;
我们来改写下:
conststate={ name:'jiaming', job:'teacher' }; let{ name:job, job:name }=state; console.log(job);//jiaming
对象也可以使用默认值,但是前提是:对象的属性值严格等于undefined。
如下:
var{x=3}={x:undefined}; console.log(x);//3 var{y=3}={y:null}; console.log(y);//null
字符串场景
字符串之所以能够被解构赋值,是因为此时字符串被转换成了一个类似数组的对象。
const[a,b,...arr]='hello'; console.log(arr);//["l","l","o"]
复制代码
let{length:len}='hello'; console.log(len);//5
数值和布尔值场景
解构赋值时,如果等号右边是数值和布尔值,则会先转换为对象(分别是基本包装类型Number和基本包装类型Boolean)。不过这种场景用得不多~
let{toString:s}=123; console.log(s);//functiontoString(){[nativecode]} console.log(s===Number.prototype.toString);//true
let{toString:s}=true; console.log(s===Boolean.prototype.toString);//true
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。
两种使用场景
1、交换两变量值
let[a,b]=['reng','jia']; [a,b]=[b,a]; console.log(b);//'reng'
2、将字符串转换为数组
let[...arr]='reng'; console.log(arr);//["r","e","n","g"] console.log(arr.splice(0,2));//["r","e"]返回删除的数组(能使用数组的方法了)
字符串扩展
针对字符串扩展这个,个人感觉模版字符串使用的频率比较高。模版字符串解放了拼接字符串带来的繁琐操作的体力劳动。
letname='jiaming'; letstr='Hello!Mynameis'+name+'.Nicetomeetyou!'; letstrTemp=`Hello!Mynameis${name}.Nicetomeetyou!`
对于新增的字符串方法,可以记下下面这几个:
trimEnd():返回字符串,表示消除参数字符串结尾的空格
数值扩展
留意下在Number对象上提供的新方法:
Number.isNaN(NaN)//true Number.isNaN(15)//false
Number.isInteger():返回布尔值,用来判断一个数值是否为整数
函数扩展
arguments对象是一个类数组,还得通过Array.prototype.slice.call(arguments)将其转换为真数组;而rest参数直接就可以使用数组的方法了。
functionadd(...arr){ console.log(arr);//[2,5,3] letsum=0; for(varvalofarr){ sum+=val; } returnsum; } console.log(add(2,5,3));//10
箭头函数
ES6允许使用“箭头”(=>)定义函数。
constf=v=>v;//注意是有返回值return的啊 //等同于 constf=function(v){ returnv; }
如果箭头函数的代码块部分多于一条语句,就要使用大括号将它们括起来,并且使用return语句返回结果。
constsum=(num1,num2)=>num1+num2; //等价于,使用了大括号,那箭头函数里面就要使用return了 constsum=(num1,num2)=>{returnnum1+num2} //等价于 constsum=function(num1,num2){ returnnum1+num2 }
使用箭头函数注意点:
不可以使用yield命令,因此箭头函数不能用作Generator函数。
functionfoo(){ setTimeout(()=>{ console.log('id:',this.id);//id:42 },100); } varid=21; foo.call({id:42});
//错误使用箭头函数的例子 constcat={ lives:9, jumps:()=>{//箭头函数的错误使用,因为对象不构成单独的作用域 this.lives--;//this指向window } } varbutton=document.getElementById('press');//一个节点对象 button.addEventListener('click',()=>{//箭头函数的this指向window this.classList.toggle('on'); }); //箭头函数改成`function`匿名函数指向就正确了。
找下茬
假设有这么一个需求,需要对二维数组的元素进行反转并被1减。我们来看下下面代码,哪个能实现此需求呢?
//代码一 constA=[[0,1,1],[1,0,1],[0,0,0]]; constflipAndInvertArr=function(A){ A.map(item=>{ item.reverse().map(r=>1-r) }) }
//代码二 constA=[[0,1,1],[1,0,1],[0,0,0]]; constflipAndInvertArr=A=>A.map(res=>res.reverse().map(r=>1-r));
运行之后,发现代码二是能实现需求的:
letresultArr=flipAndInvertArr(A); console.log(resultArr);//[[0,0,1],[0,1,0],[1,1,1]]
嗯~上面已经提到过,箭头函数体加上大括号后,是需要自己手动return的~
我们来改写下代码一,以便符合需求:
constA=[[0,1,1],[1,0,1],[0,0,0]]; constflipAndInvertArr=function(A){ return(A.map(item=>{ returnitem.reverse().map(r=>1-r) })) } letresult=flipAndInvertArr(A); console.log(result);//[[0,0,1],[0,1,0],[1,1,1]]
想要了解更多关于HTML5方面内容的小伙伴,请关注扣丁学堂HTML5培训官网、微信等平台,扣丁学堂IT职业在线学习教育平台为您提供权威的HTML5视频教程,HTML5培训后的前景无限,行业薪资和未来的发展会越来越好的,扣丁学堂老师精心推出的HTML5视频教程定能让你快速掌握HTML5从入门到精通开发实战技能。扣丁学堂H5技术交流群:673883249。
【关注微信公众号获取更多学习资料】 【扫码进入HTML5前端开发VIP免费公开课】