当前位置: 首页 > 后端技术 > Node.js

ES6新特性总结1.

时间:2023-04-03 15:42:50 Node.js

1.声明变量的关键字:const和letJavaScriptES6引入了另外两个用于声明变量的关键字:const和let。在ES6中,我们将很少再看到var了。const关键字const声明一个只读常量。一旦声明,常量的值就不能改变。const声明变量时,必须立即初始化,不能留到后面再赋值。注意:如果这个变量是数组或者对象,可以更新其中保存的内容。因为const用来声明复合类型的数据(主要是对象和数组),所以变量名并不是指向数据,而是指向数据的地址。例子如下://这种写法是行不通的conststr='helloworld';str='凯蒂猫';//TypeError:Assignmenttoconstantvariable//这种写法是可行的constarr=[1,2,3];arr[0]=9;let关键字let关键字声明的变量是可以改变的。例子如下://这种写法是可行的letstr='helloworld';str='凯蒂猫';注意:let声明的变量只在它所在的代码块中有效。没有对变量的提升:用let声明的变量必须在声明之后使用,否则会报错。//使用var定义的变量,有变量提升。控制台日志(一);//未定义的变量a=10;//使用let定义的变量,没有变量提升,所以下面的代码会报错console.log(b);//ReferenceError:b未定义letb=20;临时死区:在用let命令声明变量之前,该变量不可用。typeof不再是100%安全的操作typeofc;//ReferenceError:c未定义letc;ES6的六种变量声明方式ES5只有两种声明变量的方式:var和functionES6除了加入let和const之外,还有另外两种声明变量的方式:import命令和class命令。因此,ES6共有6种声明变量的方式。2.顶层对象的属性顶层对象是指浏览器中的window对象,Node中的全局对象。在ES5中,顶级对象的属性等同于全局变量。例:window.a=1;a//1a=2;window.a//2ES6为了改变这一点,一方面规定为了保持兼容性,var和function声明的全局变量命令仍然是顶级对象的属性;另一方面规定了let命令、const命令、class命令声明的全局变量不属于顶层对象的属性。也就是说,从ES6开始,全局变量会逐渐和顶层对象的属性解耦。例子如下:vara=1;window.a//1letb=2;window.b//undefined上面代码中,全局变量a是通过var命令声明的,所以它是顶级对象;全局变量b由let命令声明,因此它不是顶层对象的属性,返回undefined3。模板字符串在传统的JavaScript语言中,输出的模板通常是用字符串拼接起来,相当繁琐和不方便,所以ES6引入了模板字符串来解决这个问题。模板字符串(templatestring)是字符串的增强版本,用反引号(`)标记。可以用作普通字符串。它还可以用于定义多行字符串,或在字符串中嵌入变量。例子如下://普通字符串`InJavaScript'\n'isalinefeed`//Multi-linestring`InJavaScriptthisisnotlegal`//字符串中嵌入的变量letname='Bob',time='今天';`你好${name},你好吗${time}`上面代码中的模板字符串都是用反引号表示的。注意:如果需要在模板字符串中引入反引号,必须用反斜杠转义。例子如下:letgreeting=`\Yo\`变量嵌入到世界模板字符串中,变量名需要写在${}中。函数functionfn(){return"HelloWorld";}`foo${fn()}bar`//fooHelloWorldbar;4.箭头函数ES6允许使用“箭头”(=>)定义函数。例子如下:varf=v=>v;//上面的箭头函数等价于varf=function(v){returnv;}如果箭头函数需要多个参数,参数必须用括号括起来.varf=()=>5;//等价于varf=function(){return5;}varsum=(num1,num2)=>num1+num2;//等价于varsum=function(num1,num2){returnnum1+num2;}由于花括号被解释为代码块,如果箭头函数直接返回一个对象,则必须在对象外加上括号,否则会报错。//错误报告letgetTempItem=id=>{id:id,name:"temp"};//没有错误报告letgetTempItem=id=>({id:id,name:"temp"});箭头函数和变量结构可以结合使用constfull=({first,last})=>first+''+last;//等价于functionfull(person){returnperson.first+''+person.last;}5.使用export和Import实现模块化由于JavaScript没有模块系统,前人提出了很多规范来解决这个问题,其中最常用的是CommonJs和AMD。前者用于服务器,后者用于浏览器。简单看一下CommonJs的模块化方法在CommonJs中,module.exports用于暴露模块,还有一个加载模块的全局方法:require(),用于加载模块。示例代码://app.jsletperson={age:'20',name:'Jolin'};module.exports=person;//暴露对象//index.jsletperson=require('./app');//加载应用模块console.log('name'+person.name);//nameJolin注意:CommonJs的模块化方式运行在服务器端,直接在浏览器端运行是无法识别的,所以进入nodejs的安装目录,打开cmd命令窗口,输入命令nodeindex。js来运行它~好了,言归正传~ES6提供了一个简单的模块系统,可以替代CommonJs和AMD规范。那就是出口和进口。ES6中添加了两个新命令export和import。export命令用于暴露模块的对外接口,而import用于导入某个模块。示例代码://export.jsexportsvarfirstName='Micheal';exportsvarlastName='JackJson';exportsvaryear=1958;//import.jsimport{firstName,lastName}from'./export.js'console.log(名字+''+姓氏);//MichealJackJson目前对ES2015(ES6)语法的支持不是很好,所以即使是Firefox和Chrome如果版本低也可能只支持部分语法。那么ES6语法如何才能在各种浏览器中正常运行呢?然后需要通过一些编译工具将写好的JS文件编译成ES5语法,babel工具就可以实现这种转义。但是babel只能转换新的JavaScript语法(syntax),不能转换新的API,import和export这两个命令是没有任何浏览器支持的,babel也不能转换成浏览器ES5支持的,因为:babel只是一个翻译,假设a.js导入b.js,转码a.js,只翻译a.js,不将b.js的内容合并进去。如果想在最终的js中包含a.js和b.js的代码,需要使用打包工具。因此,我们可以使用webpack工具,通过打包工具生成所有浏览器都支持的单个JS文件,生成一个带有导入导出语法的JS文件。