1. es6的介绍
ECMAScript 6,简称ES6,是JavaScript 语言的一次重大更新。它于2015 年发布,是原来的ECMAScript标准的第六个版本,大大提升了JavaScript的开发体验。
2 es6的变量和模板字符串
ES6 新增了let和const,用来声明变量,使用的细节上也存在诸多差异
let 和var的差别 1、let有块级作用域,非函数的花括号遇见let会有块级作用域,也就是只能在花括号里面访问。
2、let 不能重复声明
3、let不会预解析进行变量提升(先声明,在使用)
4、let 定义的全局变量不会作为window的属性
5、let在es6中推荐优先使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 <script > { let a = 1 var b = 2 } console .log (a); console .log (b); let name = '天真' let name = '无邪' console .log (test) var test = 'test' console .log (test1) let test1 = 'test1' var a = 100 console .log (window .a ) let b = 200 console .log (window .b ) </script >
const和var的差异 1、新增const和let类似,只是const定义的变量不能修改
2、并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <script > { const A = 'atguigu' console .log (A); } const TEAM = ['刘德华' ,'张学友' ,'郭富城' ]; TEAM .push ('黎明' ); TEAM =[] console .log (TEAM ) </script >
模板字符串(template string)是增强版的字符串,用反引号(`)标识
1、字符串中可以出现换行符
2、可以使用 ${xxx} 形式输出变量和拼接变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <script > let ulStr2 = ` <ul> <li>JAVA</li> <li>html</li> <li>VUE</li> </ul>` console .log (ulStr2) let infoStr2 =`${name} 被评为本年级优秀学员` console .log (infoStr2) </script >
3 es6的解构表达式
ES6 的解构赋值是一种方便的语法,可以快速将数组或对象中的值拆分并赋值给变量。解构赋值的语法使用花括号 {} 表示对象,方括号 [] 表示数组。通过解构赋值,函数更方便进行参数接受等!
数组解构赋值
1 2 3 4 let [a, b, c] = [1 , 2 , 3 ]; console .log (a); console .log (b); console .log (c);
该语句将数组 [1, 2, 3] 中的第一个值赋值给 a 变量,第二个值赋值给 b 变量,第三个值赋值给 c 变量。 可以使用默认值为变量提供备选值,在数组中缺失对应位置的值时使用该默认值。例如:
1 2 let [a, b, c, d = 4 ] = [1 , 2 , 3 ];console .log (d);
对象解构赋值
1 2 3 4 5 6 let {a, b} = {a : 1 , b : 2 }; console .log (a); console .log (b);
该语句将对象 {a: 1, b: 2} 中的 a 属性值赋值给 a 变量,b 属性值赋值给 b 变量。 可以为标识符分配不同的变量名称,使用 : 操作符指定新的变量名。例如:
1 2 3 let {a : x, b : y} = {a : 1 , b : 2 };console .log (x); console .log (y);
函数参数解构赋值
1 2 3 4 function add ([x, y] ) { return x + y; } add ([1 , 2 ]);
4 es6的箭头函数
ES6 允许使用“箭头” 义函数。语法类似Java中的Lambda表达式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <script > let fn1 = function ( ){} let fn2 = ( )=>{} let fn3 = x =>{} let fn4 = x => console .log (x) let fun5 = x => x + 1 let person ={ name :"张三" , showName :function ( ){ console .log (this ) console .log (this .name ) }, viewName : () => { console .log (this ) console .log (this .name ) } } person.showName () person.viewName () function Counter ( ) { this .count = 0 ; setInterval (() => { this .count ++; console .log (this .count ); }, 1000 ); } let counter = new Counter (); </script >
6 es6的promise异步处理 1 普通函数和回调函数
普通函数: 正常调用的函数,一般函数执行完毕后才会继续执行下一行代码
1 2 3 4 5 6 7 8 9 <script > let fun1 = ( ) =>{ console .log ("fun1 invoked" ) } fun1 () console .log ("other code processon" ) </script >
回调函数: 一些特殊的函数,表示未来才会执行的一些功能,后续代码不会等待该函数执行完毕就开始执行了
1 2 3 4 5 6 7 <script > setTimeout (function ( ){ console .log ("setTimeout invoked" ) },2000 ) console .log ("other code processon" ) </script >
2 Promise 简介
前端中的异步编程技术,类似Java中的多线程+线程结果回调!
Promise对象有以下两个特点。
(1)Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfilled)和Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从Pending变为Resolved和从Pending变为Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。
3 Promise 基本用法
ES6规定,Promise对象是一个构造函数,用来生成Promise实例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <script > let promise = new Promise (function (resolve,reject ){ console .log ("promise do some code ... ..." ) reject ("promise fail" ) }) promise.then ( function (value ){console .log (`promise中执行了resolve:` +value)}, function (error ){console .log (`promise中执行了reject:` +error)} ) console .log ('other code2222 invoked' )</script >
4 Promise catch()
Promise.prototype.catch方法是.then(null, rejection)的别名,用于指定发生错误时的回调函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 <script > let promise =new Promise (function (resolve,reject ){ console .log ("promise do some code ... ..." ) throw new Error ("error message" ) }) console .log ('other code1111 invoked' ) */ promise.then ( function (resolveValue ){console .log (`promise中执行了resolve:${resolveValue} ` )} ).catch ( function (error ){console .log (error)} ) console .log ('other code2222 invoked' ) </script >
5 Promise.all()
Promise.all()可以帮助我们比较简单的获得多个promise对象回调函数中返回的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <script > let p1=new Promise ((resovle,reject )=> { resovle ("OK" ) }) let p2 = Promise .resolve ("success" ) let p3 = new Promise ((resovle,reject )=> { throw new Error ("oh no" ) }) let promiseAll =Promise .all ([p1,p2,p3]) console .log (promiseAll) promiseAll.then (results => { console .log (results) }).catch ( error => { console .log (error) }) </script >
then中的reject()的对应方法可以在产生异常时执行,接收到的就是异常中的提示信息 then中可以只留一个resolve()的对应方法,reject()方法可以用后续的catch替换 then中的reject对应的回调函数被后续的catch替换后,catch中接收的数据是一个异常
6 async和await的使用
async和await是ES6中用于处理异步操作的新特性。通常,异步操作会涉及到Promise对象,而async/await则是在Promise基础上提供了更加直观和易于使用的语法。
1 async标识函数后,async函数的返回值会变成一个promise对象
2 如果函数内部返回的是一个promise对象,则async函数返回的状态与结果由该对象接手
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <script > async function fun1 ( ){ let promise = Promise .reject ("heihei" ) return promise } let promise =fun1 () promise.then ( function (value ){ console .log ("success:" +value) } ).catch ( function (value ){ console .log ("fail:" +value) } ) </script >
await
await右侧的表达式一般为一个promise对象,但是也可以是一个其他值,如果表达式是其他值,则直接返回该值,当然,是普通值没有意义。
如果表达式是promise对象,await返回的是promise成功的值,一般就是用在这里
await会等右边的promise对象执行结束,然后再获取结果,这个await所在函数里面的后续代码也会等待await的执行
await必须在async函数中,但是async函数中可以没有await
如果await右边的promise失败了,就会抛出异常,需要通过 try … catch捕获处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <script > async function fun1 ( ){ return 10 } async function fun2 ( ){ try { let res = await fun1 () }catch (e){ console .log ("catch got:" +e) } console .log ("await got:" +res) } fun2 () </script >
7 es6的模块化处理 1 模块化介绍
模块化是一种组织和管理前端代码的方式,将代码拆分成小的模块单元,使得代码更易于维护、扩展和复用。它包括了定义、导出、导入以及管理模块的方法和规范。
ES6模块化的几种暴露和导入方式
分别导出
统一导出
默认导出
ES6中无论以何种方式导出,导出的都是一个对象,导出的内容都可以理解为是向这个对象中添加属性或者方法
2 分别导出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 export const PI = 3.14 export function sum (a, b ) { return a + b; } export class Person { constructor (name, age ) { this .name = name; this .age = age; } sayHello ( ) { console .log (`Hello, my name is ${this .name} , I'm ${this .age} years old.` ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 import * as m1 from './module.js' console .log (m1.PI )let result =m1.sum (10 ,20 )console .log (result)let person =new m1.Person ('张三' ,10 )person.sayHello ()
index.html作为程序启动的入口 导入 app.js
1 2 <script src ="./app.js" type ="module" />
3 统一导出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 const PI = 3.14 function sum (a, b ) { return a + b; } class Person { constructor (name, age ) { this .name = name; this .age = age; } sayHello ( ) { console .log (`Hello, my name is ${this .name} , I'm ${this .age} years old.` ); } } export { PI , sum, Person }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 import {PI ,Person ,sum,PI as pi,Person as People ,sum as add} from './module.js' console .log (PI )console .log (pi)let result1 =sum (10 ,20 )console .log (result1)let result2 =add (10 ,20 )console .log (result2)let person1 =new Person ('张三' ,10 )person1.sayHello () let person2 =new People ('李四' ,11 )person2.sayHello ()
4 默认导出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 export const PI = 3.14 class Person { constructor (name, age ) { this .name = name; this .age = age; } sayHello ( ) { console .log (`Hello, my name is ${this .name} , I'm ${this .age} years old.` ); } } function sum (a, b ) { return a + b; } export default sumexport { Person }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import * as m1 from './module.js' import {default as add} from './module.js' import add2 from './module.js' let result =m1.default (10 ,20 )console .log (result)let result2 =add (10 ,20 )console .log (result2)let result3 =add2 (10 ,20 )console .log (result3)import {PI ,Person } from './module.js' let person =new Person ('张三' ,10 )person.sayHello () console .log (PI )