ES6新特性 我会带着你远行 2021-10-29 07:08 525阅读 0赞 **1.****变量声明let和const** 在ES6以前,var关键字声明变量。无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部)。这就是函数变量提升例如: function aa() { if(bool) { var test = 'hello man' } else { console.log(test) } } 以上代码实际为: var bool=true; function aa() { var test // 变量提升 if(bool) { test = 'hello man'; console.log(test) } else { //此处访问test 值为undefined console.log(test) } console.log(test)//此处访问test 值为'hello man } console.log(test)//错误 aa(); ES6中: const:常量; let:变量; const PI2= 3.1415926 PI2 = 201452789 //再次赋值此时会报错 //常量则不能更改 const callbacks=[]; for(var i=0;i<=2;i++){ callbacks[i]=function(){ return i*2; } } console.table([ callbacks[0](), callbacks[1](), callbacks[2](), ]) 运行结果“ ![1038932-20180407175242132-700419035.png][] const callbacks2=[]; //只有let这一处不一样!!!! for(let i=0;i<=2;i++){ callbacks2[i]=function(){ return i*2; } } console.table([ callbacks2[0](), callbacks2[1](), callbacks2[2](), ]) 代码结果: ![1038932-20180407175535642-2089564288.png][] 因为let和const都是块级作用域。let的作用域是在它所在当前代码块,但不会被提升到当前函数的最顶部。 **const再次声明对象的引用时,不会报错!** const b={ a:3 }; b.a=4; b.c=5; console.log(b.a); //4 console.log(b.c); //5 const b={ a:3 }; b=2; //Uncaught SyntaxError: Identifier 'b' has already been declared 因为对象是引用类型,返回的是对象存储的指针,上例中,b是指向存储的指针,指针因为const是不变的,但是它指向的内容b.a可以变。 **2.ES5****中块作用域:立即执行函数: ( (function()\{\}) ());** ( (function(){ function f2(){ return 1; } console.log(f2()===1); //true }) () ); ( (function(){ function f2(){ return 2; } console.log(f2()===2); //true }) () ) **ES6****中块作用域:\{\}** { function f2(){ return 1; } console.log(f2()===1); //true } { function f2(){ return 2; } console.log(f2()===2); //true } **3****.箭头函数** ES5 function a()\{\} { const evens=[1,3,5,7]; const odds=evens.map( function(v){ return v+1; }) console.log(evens,odds); //(4) [1, 3, 5, 7] (4) [2, 4, 6, 8] } ES6 ()=>\{\} //只有一个参数时,小括号可以省略;\{\}中的表达式直接作为返回值时,\{\}也可以省略 { const evens=[1,3,5,7]; const odds=evens.map(v=>v+1); console.log(evens,odds); //(4) [1, 3, 5, 7] (4) [2, 4, 6, 8] } ES6中this没有形成自己的作用域,this指向离它最近的作用域块 //ES5 function Foo(){ this.a='a'; this.b='b'; //此处为构造函数,则this 指向实例f2本身 this.c={ a:'a+', b:function(){ return this.a; //此处thi.c为都对象,则this指向对象本身 } } } var f2=new Foo(); console.log(f2.c.b()); //a+ //ES6 function Foo(){ this.a='a'; this.b='b'; this.c={ a:'a+', b:()=>this.a } } var f2=new Foo(); console.log(f2.c.b()); //a **4****.默认参数** //ES5 function f(x,y,z){ y=y||2; z=z||2; return x+y+z}; f(2)//6; f(2,3)//7 f(2,3,4)//9 //ES6 function f(x,y=2,z=2){ return x+y+z}; f(2)//6; f(2,3)//7 f(2,3,4)//9 f() //NaN **5****.异常参数检测** 在4的实例中,函数f调用时应至少传入一个参数,那若一个参数都不传入时,会显示NaN; ES6可以用在此处作参数异常检测; { function cheackPara(){ throw new Error('There isn\'t a parameter'); } function f(x= cheackPara(),y=2,z=2){ return x+y+z}; try{ f() } catch(e){ console.log(e) } //Error: There isn't a parameter } **可变参数** //ES5 需要借助数组的arguments { function f(){ var a=Array.prototype.slice.call(arguments); var sum=0; a.forEach(function(item){ sum+=item; }) return sum; } console.log(f(1)); //1 console.log(f(1,2,3)); //6 } //ES6 function f(...a){ //... 为扩展运算符,则a为可变参数列表 var sum=0; a.forEach(item=>{sum+=item}); return sum; } console.log(f(1)); //1 console.log(f(1,2,3)); //6 //ES5合并数组 var a=[1,2,3]; var b=[4,5]; b=b.concat(a) //[4,5, 1, 2, 3] console.log(b); c=[4,5].concat(a); console.log(c); //[4,5, 1, 2, 3] //ES6运用扩展运算符合并数组 var a=[1,2,3]; var b=[4,5]; b=[b,...a]; //[Array(2), 1, 2, 3] console.log(b); c=[4,5,...a]; console.log(c); //[4,5, 1, 2, 3] **6.ES6代理** **ES6中数据保护,原理就是通过访问代理,对数据访问做限制,最终提供的数据不是源数据** { let Person={ name:'ES6', sex:'male', age:16 }; let person= new Proxy( Person,{ //代理 get (target,key){ //读操作 return target[key]; }, set (target,key,value){ //写操作 if(key !=='sex'){ target[key]=value; } } }); console.table({ name: person.name, //此处的person为代理,不是原数据 sex: person.sex, age: person.age }) } 运行结果: ![1038932-20180407221623867-2021891567.png][] 更多ES6相关知识 ![1038932-20180407221742797-1577713124.png][] 转载于:https://www.cnblogs.com/sunmarvell/p/8734177.html [1038932-20180407175242132-700419035.png]: /images/20211029/b1fd641961ec4e14a6bd7431743e5e09.png [1038932-20180407175535642-2089564288.png]: /images/20211029/b2f8625973a241eab6945c3b4fd836a7.png [1038932-20180407221623867-2021891567.png]: /images/20211029/b7ba5cef53764bc095d7d867c366d578.png [1038932-20180407221742797-1577713124.png]: /images/20211029/553eee575ab34b2a906e3991d4c775ba.png
相关 ES6新特性 ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下⼀个版本标准,2015.06 发版。ES6 主要是为了解决 ES5 的先天不⾜,⽐如 Jav... 矫情吗;*/ 2024年04月21日 08:03/ 0 赞/ 82 阅读
相关 ES6新特性 文章目录 一、ECMASript 介绍 二、ES6 新特性 2.1 let、const 关键字 2.2 变量的解构赋值 ゝ一世哀愁。/ 2022年09月06日 15:27/ 0 赞/ 287 阅读
相关 ES5&ES6新特性 ES5和6的一些新特性 1、let和const var有一个问题,就是定义的变量有时会莫名奇妙的成为全局变量。 for(var i = 0; i < 淡淡的烟草味﹌/ 2022年04月11日 12:13/ 0 赞/ 347 阅读
相关 es6新特性 1.let && const •都是块级作用域 •不能重复定义 •避免了变量提升 ① let命令也用于声明对象,但是作用域为局部。 ![在这里插入图片描述][ 红太狼/ 2022年03月07日 21:24/ 0 赞/ 378 阅读
相关 es6新特性 es6语法 > es6语法用起来是十分方便的,但是有些浏览器还是不支持,但是做大型项目中基本上要用到转码器(babel转码器),可以把es6语法转为es5直接使用。 T 落日映苍穹つ/ 2022年01月25日 15:30/ 0 赞/ 378 阅读
相关 ES6新特性 转:[https://www.jianshu.com/p/87008f4f8513][https_www.jianshu.com_p_87008f4f8513] co Bertha 。/ 2022年01月12日 02:19/ 0 赞/ 352 阅读
相关 ES6新特性 转自:[https://www.jianshu.com/p/87008f4f8513][https_www.jianshu.com_p_87008f4f8513] 1.con 冷不防/ 2021年12月18日 07:07/ 0 赞/ 355 阅读
相关 es6新特性 https://www.cnblogs.com/minghui007/p/8177925.html 转载于:https://www.cnblogs.com/LWWTT/p/1 野性酷女/ 2021年11月02日 14:58/ 0 赞/ 516 阅读
相关 ES6新特性 1.变量声明let和const 在ES6以前,var关键字声明变量。无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部)。这就是函数变量提升例如: 我会带着你远行/ 2021年10月29日 07:08/ 0 赞/ 526 阅读
相关 ES6新特性 1.声明变量的关键字:const 和 let JavaScript ES6中引入了另外两个声明变量的关键字:const和let。在ES6中,我们将很少能看到var了。 co 电玩女神/ 2021年09月17日 01:12/ 0 赞/ 515 阅读
还没有评论,来说两句吧...