ES6笔记(字符串模板、异步、promise)

1、模板字符串
es6模板字符简直是开发者的福音啊,解决了ES5在字符串功能上的痛点。
第一个用途,基本的字符串格式化。将表达式嵌入字符串中进行拼接。用${}来界定。

第二个用途,在ES5时我们通过反斜杠(\)来做多行字符串或者字符串一行行拼接。ES6反引号(``)直接搞定。

//以前的写法
var str='javasrcipt\
   is\
   amazing';
console.log(str)

---------------------------------

var str=`javasrcipt
   is
   amazing`;
console.log(str)

---------------------------------

//变量相连
var userName='aaa'
console.log('hello'+userName)
console.log(`hello ${userName}`)
console.log('hello this is\''+'\"amazing\"' +userName)
console.log(`hello this is "amazing" ${userName}`)


2、什么是闭包?
当函数可以记住并访问所在的词法作用域时,就产生了闭包

3、什么是异步?
任何时候,只要把一段代码包装成一个函数,并指定他在响应某个事件( 定时器,鼠标点击,ajax响应等 )(还有回调)

时执行,就在代码中创建了一个将来执行的块,这就是一个异步程序

//同步程序,必须等待前面的代码执行完成之后,才会执行到这里
for(var i=0;i<10000000;i++){}
console.log(i)


//异步
//javascript是单线程编程语言,基于事件循环(事件循环队列,先进先出,后进后出)
function show(){
	console.log('aaa')
}
setTimeout(show,1000);
console.log('abc')
 
 //循环中的异步    
 //先输出5,然后再同时输出5个5
 //同时把5个定时器加到队列中,都要在一秒之后完成,但是1秒后的i已经变成5了,同时输出,非隔一个输出
 for(var i=0;i<5;i++){
 	setTimeout(function(){
 		console.log(i) //5个5
 	},1000)
 }
console.log(i) //5
 

//利用立即表达式(闭包),让i存下来不会被改变
 for(var i=0;i<5;i++){
 	(function(j){
 	    setTimeout(function(){
 		  console.log(j)   //0 1 2 3 4
 	   },1000)
 	})(i)
 }
console.log(i) //5

4、Promise( 承诺 )

//将来发生的事情:可以拿到汉堡(但不是绝对的,可能卖完了)	
var oPromise=new Promise(function(resolve,reject){
	setTimeout(function(){
		console.log('制作汉堡中');
		resolve('汉堡做好了');
		reject('汉堡卖完了')
	},2000)
});
oPromise.then(function(val){
	console.log(val)
},function(data){
	console.log(data)
})

特性:异步机制

var oPromise=new Promise(function(resolve,reject){
	console.log('创建promise');
	//异步代码
	resolve('ok');
});
oPromise.then(function(val){
	console.log(val)
})
console.log('promise外部的代码')
//执行顺序:
//创建promise  
//promise外部的代码
//ok

promise有3种状态:pending,resolve,reject(开始创建都是pending,只要执行相应的resolve或者reject都要相应改变状态),

状态改完后是改不回来的(已经有resolve,再输入个reject,也不会改成reject状态)

var oPromise1=new Promise(function(resolve,reject){
	resolve(1);//没有定时器,立即执行,把pending改为resolve状态
})
var oPromise2=new Promise(function(resolve,reject){
	setTimeout(function(){
		resolve(2);
	},500)
})
var oPromise3=new Promise(function(resolve,reject){
	setTimeout(function(){
		reject(3);
	},500)
})
console.log(oPromise1)
console.log(oPromise2)
console.log(oPromise3)
setTimeout(function(){
	console.log(oPromise2)
},1000)
setTimeout(function(){
	console.log(oPromise3)
},1000)


oPromise1.then(function(value){
	console.log(value)
})
oPromise2.then(function(value){
	console.log(value)
})
oPromise3.then(function(err){
	console.log(err)
})

链式调用与语法糖

var oPromise=new Promise(function(resolve,reject){
	resolve(1);
})
oPromise.then(function(value){
	console.log(value); //1
	return value*2;//return new Promise(function(resolve,reject){ resolve(value*2)}
}).then(function(value){
	console.log(value); //2
}).then(function(value){
	console.log(value); //undefined
	//return Promise.resolve('resolve') //return new Promise(function(resolve,reject){ resolve('resolve')}
    return 'resolve'
}).then(function(value){
	console.log(value); //resolve
	return Promise.reject('reject') //return new Promise(function(resolve,reject){ reject('reject')}
}).then(function(value){
	console.log(value)
},function(err){
	console.log(err) //reject
})

all和race

//all(全部执行完成才停止)
function task(delay) {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve(delay);
        }, delay);
    });
}
var startDate = Date.now();
// 所有promise变为resolve后程序退出
Promise.all([ //里面的是一个个promise的任务
    task(1), //这个任务是1秒钟后变为resolve状态
    task(32), //这是32
    task(64),
    task(128)
]).then(function (values) {
    console.log(Date.now() - startDate + 'ms');
    // >= 128ms
    console.log(values);    // [1,32,64,128]
});

-------------------------------------------------
//race(只要有一个执行完就停止)
function task(delay) {
    return new Promise(function (resolve) {
        setTimeout(function () {
            resolve(delay);
        }, delay);
    });
}
// 任何一个promise变为resolve或reject 的话程序就停止运行
Promise.race([
    task(1),
    task(32),
    task(64),
    task(128)
]).then(function (value) {
    console.log(value);  //1
});

5、import、export (模块管理机制)

扫描二维码关注公众号,回复: 4600784 查看本文章

a.js( import导入 )----> b.js( export 导出 )

require js, seajs...

①安装  babel-cli 、babel-preset-es2015

②建议文件 .babelrc

{
    "presets": [
      "es2015"
    ],
    "plugins":[]
}

例子:

a.js

//单个导出
//导出变量
export var a=10

//导出函数
export function show(){
	return 'hhhhh'
}

------------------------------

//多个导出
var a=10
function show(){
	return 'hhhhh'
}
var obj={
	'userAge':20
}

export{a,show,obj}
b.js

//import {a as c} from './a.js'  改变名字
//import {a,show,obj} from './a.js'
//import {*} from './a.js'  整个导出
 import * as all from './a.js'

//console.log(a)
//console.log(show())
//console.log(obj.userAge)
console.log(all.a)
console.log(all.show())
console.log(all.obj.userAge)
命令行  babel-node b.js

猜你喜欢

转载自blog.csdn.net/qq_14993375/article/details/79799909