1.ES6.0兼容性
IE10+、Chrome、FireFox、移动端、NodeJS
对于不支持ES6.0解决方案:在线转换,提前编译
2.ES6.0新特性
1)变量
2)函数
3)数组
4)字符串
5)面向对象
6)Promise
7)generator
8)模块化
3.变量
3.1 var问题
- 可以重复声明
//声明了两次a
var a=10;
var a=5;
alert(a);//5
- 无法限制修改
例如定义一个常量PI - 没有块级作用域
3.2 let const
let 不能重复声明,变量-可以修改,块级作用域(块就是{ }之间)
const不能重复声明, 常量-不能修改,块级作用域
块级作用域示例
- 使用var存在的问题:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script>
window.onload=function(){
var btns=document.getElementsByTagName('button');
//click方法必须要点击的时候才能会调用,但是for循环已经执行完毕,i等于最后一个值,
//所以当点击的时候总是最后一个值3
for(var i=0;i<btns.length;i++){
btns[i].onclick=function(){
alert(i);
}
}
}
</script>
</head>
<body>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
</body>
</html>
- 之前的解决方法,保存外层函数的执行作用域,也就是用闭包来解决。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script>
window.onload=function(){
var btns=document.getElementsByTagName('button');
for(var i=0;i<btns.length;i++){
(function(i){
btns[i].onclick=function(){
alert(i);
};
})(i);
}
}
</script>
</head>
<body>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
</body>
</html>
- 使用let直接解决问题
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script>
window.onload=function(){
var btns=document.getElementsByTagName('button');
for(let i=0;i<btns.length;i++){
btns[i].onclick=function(){
alert(i);
}
}
}
</script>
</head>
<body>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
</body>
</html>
4.函数
4.1 箭头函数
- 如果只有一个参数,()可以省
- 如果只有一个return语句,{}和return都可以省
function(){
}
()=>{
}
/*
window.onload=function(){
alert('abc');
}*/
window.onload=()=>{
alert('abc');
}
<script>
/*
let show=function(a,b){
alert(a+b);
}*/
let show=(a,b)=>{
alert(a+b);
}
show(3,5);
</script>
<script>
let arr=[12,5,8,99,33,14,26];
/*
arr.sort(function(n1,n2){
return n1-n2;
})*/
arr.sort((n1,n2)=>{
return n1-n2;
})
alert(arr);
</script>
- 箭头函数有几个使用注意点。
(1)函数体内的this对象,就是定义时所在的对象,而不是使用时所在的对象。能够绑定函数定义时的作用域。 (重要)
(2)不可以当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。
(3)不可以使用arguments对象,该对象在函数体内不存在。如果要用,可以用 rest 参数代替。
(4)没有super。
(5)不能改变this的指向。
(6)不可以使用yield命令,因此箭头函数不能用作 Generator 函数。
4.2 函数的参数
- 参数展开和扩展
1)收集参数
function show(a,b,...args){}
注意:Rest Parameter必须是最后一个,将其他参数放到args数组里。
2)展开数组
展开后的效果,等同于直接把数组内容拿出来。
let arr1=[1,2,3];
//show(1,2,3);
show(...arr1);
let arr2=[4,5,6];
let arr=[...arr1,arr2];
- 默认参数
function show(a,b=5,c=12){
console.log(a,b,c);
}
show(99,18) //99,18,12
5.解构赋值
- 左右两边结构必须一样
- 右边必须是个东西
- 声明和赋值不能分开
let [a,b,c]=[1,2,3];
console.log(a,b,c);//1,2,3
let {a,b,c}={a:12,b:5,c:8};
let [{a,b},[n1,n2,n3]],num,str] =[{a:12,b:5},[12,5,8],8,'cxzcv'];
//可以拆成任意粒度
let [json,arr,num,str]=[{a:12,b:5},[12,5,8],8,'cxzcv'];
6.数组
6.1 map 函数
<script>
let arr=[12,5,8];
let result=arr.map(function(item){
return item*2;
});
alert(result);
let score=[19,85,99,25,90];
//一个参数省略(),一个return语句省略{}
let sc=score.map(item=>item>=60?'及格':'不及格');
alert(sc);
</script>
6.2 reduce函数 汇总 一堆出来一个
例1:求和
<script>
let arr=[12,69,180,8763];
//tmp中间结果,item就是实际的数,index索引从1开始
//一开始tmp=12
let result=arr.reduce(function(tmp,item,index){
return tmp+item;
});
alert(result);
</script>
例2:求平均值
<script>
let arr=[12,69,180,8763];
//tmp中间结果,item就是实际的数,index索引从1开始
//一开始tmp=12
let result=arr.reduce(function(tmp,item,index){
//不是最后一次
if(index!=arr.length-1){
return tmp+item;}
else{
return (tmp+item)/arr.length;}
});
alert(result);
</script>
6.3 filter 过滤器
<script>
let arr=[7,11,12,69,180,8763];
//能被3整除的留下
let result=arr.filter(item=>item%3==0);
alert(result);
</script>
6.4 forEach 循环(迭代)
<script>
let arr=[7,11,12,69,180,8763];
/*arr.forEach(function(item){
alert(item);
})*/
//箭头函数,一个参数()可以省略
arr.forEach((item,index)=>{
alert(index+':'+item);
})
</script>
7.字符串
7.1多了两个新方法:startsWith、endsWith
<script>
let str='http://it.lalalla.com';
if(str.startsWith('http://')){
alert('普通网址');
}else{
alert('其他');
}
</script>
7.2字符串模板
<script>
let a=12;
//将变量直接放入字符串中去
let str=`a${a}bc`;
alert(str);
</script>
8.面向对象
8.1ES6之前实现创建对象和继承
之前没有类的概念,利用构造函数和原型模式来创建对象。
<script>
function User(name,pass){
this.name=name;
this.pass=pass;
}
User.prototype.showName=function(){
alert(this.name);
}
User.prototype.showPass=function(){
alert(this.pass);
}
let user=new User('blue',123);
user.showName();
user.showPass();
</script>
通过原型链和调用构造函数来实现继承。
<script>
function User(name,pass){
this.name=name;
this.pass=pass;
}
User.prototype.showName=function(){
alert(this.name);
}
User.prototype.showPass=function(){
alert(this.pass);
}
let user=new User('blue',123);
user.showName();
user.showPass();
function VipUser(name,pass,level){
User.call(this,name,pass);
this.level=level;
}
VipUser.prototype=new User();
VipUser.prototype.showLevel=function(){
alert(this.level);
}
let vip=new VipUser('blue',123,3);
vip.showName();
vip.showPass();
vip.showLevel();
</script>
8.2 ES6有了class的概念,使用class创建类,使用extends实现继承
使用class创建类
<script>
class User{
constructor(name,pass){
this.name=name;
this.pass=pass;
}
showName(){
alert(this.name);
}
showPass(){
alert(this.pass);
}
}
let user=new User('blue',123);
user.showName();
user.showPass();
</script>
使用extends实现继承
<script>
class VipUser extends User{
constructor(name,pass,level){
super(name,pass);
this.level=level;
}
showLevel(){
alert(this.level);
}
}
let vip=new VipUser('blue',123,3);
vip.showName();
vip.showPass();
vip.showLevel();
</script>
9.json(ES5中已经有了,这里回顾一下)
9.1JSON对象
json格式:只能用双引号,所有的名字都必须用引号包起来
JSON.stringify():将json转换成字符串
JSON.parse():将字符串转换成json
<script>
let json={"a":12,"b":14,"c":3};
alert(JSON.stringify(json));
let str='{"a":12,"b":14,"c":3}';
json=JSON.parse(str);
alert(json);
</script>
9.2 json的简写
名字和值(key和value一样),只写一个就行
<script>
let a=12,b=13;
let json={a,b,c:15};
console.log(json);
</script>
方法 :function一块删除
<script>
let json={
a:15,
/*show:function(){
alert(this.a);
}*/
show(){
alert(this.a);
}
}
json.show();
</script>
10.Promise(异步操作)
异步:操作之间没有关系,同时进行多个操作,操作之间不互相干扰。
同步:操作之间有关系,同时只能做一件事。
- Promise封装原生的Ajax操作
function createPromise(url,method,data){
method= method.toUpperCase();
return new Promise((resolve,reject)=>{
let xmlHttp=window.XMLHttpRequest?new XMLHttpRequest():new ActiveXObject('Microsoft.XMLHTTP');
xmlHttp.onreadystatechange=function(){
//表示发送完成
if(xmlHttp.readyState==4){
//表示请求成功
if(xmlHttp.status>=200&&xmlHttp.status<300||xmlHttp.status==304){
responseJson=JSON.parse(xmlHttp.responseText);
resolve(responseJson);
}
//请求失败
else{
let error={code:xmlHttp.status,responce:xmlHttp.response};
reject(error);
}
}
}
if(method=='POST'){
xmlHttp.open(url,method,true);
xmlHttp.setRequestHeader('content-type','application/x-www-form-urlencoded');
if(data!=null)
xmlHttp.send(JSON.stringnify(data));
else
xmlHttp.send();
}
else{
if(params!=null)
url=url+'?'+‘data=’+JSON.stringnify(data);
xmlHttp.open(url,method,true);
xmlHttp.send();
}
});
}
createPromise(url,'GET',data).
then((responseJson)=>{console.log('成功了'+responseJson)},(error)=>{console.log('失败了'+error)};
- 发起多个Ajax请求
// 获取产品数据
createPromise('products.json').then((products) => {
console.log('Promises/products >>>', products);
// 获取用户数据
return createPromise('users.json');
}).then((users) => {
console.log('Promises/users >>>', users);
// 获取评论数据
return createPromise('comments.json');
}).then((comments) => {
console.log('Promises/comments >>>', comments);
});
jquery封装好的:
<script>
Promise.all([
//把要发的所有请求放到这
$.ajax({url:'data/json.txt',dataType:'json'}),
$.ajax({url:'data/arr.txt',dataType:'json'}),
]).then(
//所有请求都成功后的函数
function(result){
//result是所有结果的数组
//利用解构赋值
let [json,arr]=result;
console.log(json,arr);
},
//至少有一个没成功
function(err){
alert("失败了");
}
)
</script>
11.async await
不依赖于外部的runner
可以用箭头函数
async function readData(){
let data1=await $.ajax({url:'data/1.txt',dataType:'json'});
let data2=await $.ajax({url:'data/2.txt',dataType:'json'});
let data3=await $.ajax({url:'data/3.txt',dataType:'json'});
console.log(data1,data2,data3)
}
readData();
使用async await实现多个Ajax请求
用同步的思想解决异步的问题
(async () => {
// 获取产品数据
let data = await createPromise('products.json');
// 获取用户数据
let users = await createPromise('users.json');
// 获取评论数据
let products = await createPromise('comments.json');
console.log('ES7 Async/products >>>', products);
console.log('ES7 Async/users >>>', users);
console.log('ES7 Async/comments >>>', comments);
}());
结合fetch使用
(async () => {
let parallelDataFetch = await* [
(await fetch('products.json')).json(),
(await fetch('users.json')).json(),
(await fetch('comments.json')).json()
];
console.log('Async parallel+fetch >>>', parallelDataFetch);
}());
12.generator-生成器函数
普通函数:一路到底
generator:中间能停
function *show(){
alert('a');
yield;
alert('b');
}
let genObj=show();
genObject.next();//a
genObject.next();//b
yield
- yield传参
function *show(){
alert('a');
let a=yield;
alert('b');
alert(a);//5
}
let genObj=show();
genObject.next(12);//a 没法给yield传参
genObject.next(5);//b
- yield返回
function *show(){
alert('a');
yield 12;//12表示中间返回值
alert('b');
}
let genObj=show();
let a=genObject.next();//{value:12,done:false}
let b=genObject.next();//{value:undefined,done:true}
13.ES7&ES8预览
1)数组
- includes():数组是否包含某个东西。
-
keys()/values()/entries()
keys:所有的key
values:所有的values
entries:所有的key-value键值对
<script>
let arr=[1,233,34,5];
alert(arr.includes(1));
for(let key of arr.keys()){
alert(key);
}
for(let value of arr.values()){
alert(value);
}
for(let [key,value] of arr.entries()){
alert(`${key},${value}`);
}
</script>
2)字符串
padStart()/padEnd()
<script>
alert('('+'abc'.padStart(5)+')');
alert('('+'abc'.padEnd(5)+')');
alert('('+'abc'.padStart(10,'0')+')');
alert('('+'abc'.padEnd(10,'0')+')');
</script>