手记

ES6 (Es2015) 的新特性光速之旅

ES6 (Es2015) 的新特性光速之旅

简介

ES6, 全称ECMAScript 6.0, 是JaveScript的下一个版本标准, 2015.06发版.

ECMAScript是JavaScript语言的国际标准,JavaScript是ECMAScript的实现

使用目的

提供了大量复杂度不同的特性, 来满足不同复杂程度的应用开发.

主要的新特性

  • 变量与常量

es5 的写法

  var a = 10;
  var a = 15;
  
  var b = 20;
  	  b = 16;
  
  -----------------------------------
  
 //有三个按钮绑定点击事件点击,依次弹出1,2,3
  window.onload = function(){
      var oBtn = document.getElementsByTagName('button');
      for(var i =0; i < oBtn.length;i++){
          oBtn[i].addEventListener('click',function(){
              alert(i); // 3,3,3
          })
      }
  }
  //解决办法: 加立即执行函数
  window.onload = function () {
      var oBtn = document.getElementsByTagName('button');
      for (var i = 0; i < oBtn.length; i++) {
          (function (i) {
              oBtn[i].addEventListener('click', function () {
                  alert(i); //0,1,2
              })
          })(i);
      }
  }
  

es6的写法

  let a = 10;
  let a = 15;//error
  
  let b = 11;
  	  b = 22;//22
  
  const c = 20;
  const c = 25; //error
  
  const d = 30;
        d = 35; //16
  
  -----------------------------------
  window.onload = function(){
      var oBtn = document.getElementsByTagName('button');
      for(let i =0; i < oBtn.length;i++){
          oBtn[i].addEventListener('click',function(){
              alert(i); // 0,1,2
          })
      }
  }

小结

  • var 可以重复声明,无限次修改,没有作用域

  • let 不能重复声明,变量可以修改值,有作用域

  • const 不能重复声明,常量不可以修改值,有作用域

  • 解构赋值

  let [a,b] = [1,2]; 
    console.log(a,b); //1,2
    
    let [a,b];
    [a,b] = [1,2]; //error 
    
    let {name,age,job} = {name:"bobocode",age:23,job:'web'}
    console.log(name,age,job);  // bobocode 23 web
    
    let [{a,b},[arr]] = [{a:'testa',b:'testb'},[1,2,3]];
    console.log(a,b,arr); // testa testb [1, 2, 3]
    
    let arr1 = [1,2,3];
    let arr2 = [5,6,7];
    let newArr = [...arr1,...arr2];
    console.log(newArr); //[1, 2, 3, 5, 6, 7]
    

小结

  • 解构赋值声明和赋值不能分开写
    • 解构赋值等号左右两边的结构必须相同
    • 解构赋值右边必须是有意义的结构(arr,json等)
  • 数组新方法

 // map(映射)
  [1,2,3,4].map(function(item){
      console.log(item*2); //1,4,9,16 
  });
  
 // reduce(总和)
 [1,2,3,4].reduce(function(temp,value,index){
  return temp+ value; //10 
 })

 // fliter(过滤)
 [1,2,4,8,9].filter(function(item){
   return item % 2 == 0; // 2,4,8
 })

 // forEach(迭代)
 [3,51,34,53].forEach(function(item,index){
   console.log(item+","+index);//3,0  51,1 34,2 53,3
})
  • 箭头函数

es5 的写法

  function Test(a,b){
      return a + b;
  }
  
  function Test(c){
      return c*c;
  }
  

es6的写法

  (a,b)=>{a+b}
  
  c=>{c*c}

小结

  • 函数只有一个参数,() 可以省略
  • 函数返回语句只有一个,{} 可以省略
  • 模板字符串

es5 的写法

  
  // 字符串拼装
  var text = 'hello';
  var div = '<div><ul>\
  	<li>'+text+'</li>\
  	</ul></div>';

es6的写法

  
  // 字符串模板
	let text = 'hello';
	let div =`<div>
	<ul>
	<li>${text}</li>
	</ul>
	</div>`
	
  // 新的方法
  	//startWith()  
  	"http://www.baidu.com".startsWith('http'); //true
  	//endsWith()  
  	"js/index.js".endsWith('.js'); //true
  • 面向对象class

es5 的写法

var Person = function(name,age){
    this.name = name;
    this.age = age;
}
Person.prototype.showInfo = function(){
    console.log(this.name + ","+ this.age);
}
var p = new Person('bb',12)
p.showInfo() //bb,12

// es5继承的写法
var Student = function(name,age,score){
    Person.call(this,name,age);
    this.score = score;
}
Student.prototype = new Person();
Student.prototype.constructor = Student;
Student.prototype.showScore= function(){
    console.log(this.name + ","+ this.age +","+ this.score);
}
var s = new Student('bb',12,98);
s.showScore() //bb,12,98

es6 的写法

class Person{
    constructor(name,age){
        this.name = name;
        this.age = age;
    }
    showInfo(){
        console.log(this.name + ","+ this.age);
    }
}
var p = new Person('bb',12)
p.showInfo() //bb,12

// es6继承的写法

class Student extends Person{
constructor(name,age,score){
    super(name,age,score);
    	this.score = score;
    }
    showScore(){
    	console.log(this.name + ","+ this.age +","+ this.score);
    }
}
var s = new Student('bb',12,98);
s.showScore() //
bb,12,98
  • Promise

// 发送一个ajax请求(jquery3版本之前的写法,版本3ajax内嵌promise语法)
var p = new Promise(function(resolve,reject){
    $ajax({
        url: '',
        dataType: 'json',
        success(){
            resolve();
        },
        error(){
            reject();
        }
    });
});

let result = p.then(function(data){
    console.log('success'+data);
},function(err){
    console.log('error'+err);
})
-----------------------------------
// Promise.all 的使用
function createPromise(urls){
    reutrn new Promise(function(resolve,reject){
        $ajax({
            urls //key 和 value 相同,可以省略
            dataType: 'json',
            success(){
                resolve();
            },
            error(){
                reject();
            }
        });
    });
}

Promise.all([
    createPromise('data/test.txt'),
    createPromise('data/test2.txt')
]).then(function(arr){
    let [res1,res2] = arr;
    console.log('success'+res1);
    console.log(''+res2);
},function(err){
    console.log('error'+err);
})

  • generator

// 标准的生成器写法
let a = 'a';
let b = 'b';
function *test(){
    console.log(a);
    yield;
    console.log(b);
}

let res = test();
res.next(); // 'a'
res.next(); // 'b'

-----------------------------------
// yeild 带参数的
let a = 'a';
let b = 'b';
function *test(){
    console.log(a);
    b = yield;
    console.log(b);
}

let res = test();
res.next(11); //a
res.next(3);  //3
//{value: undefined, done: true} 没返回值 

-----------------------------------
// yeild 带返回值的
let a = 'a';
let b = 'b';
let c = 'c';
function *test(){
    console.log(a);
    b = yield;
    console.log(b);
    c = yield;
    console.log(c);
    return 5;
}

let res = test();
res.next(11); //a
res.next(3);  //3
res.next(2); //2
//{value: 5, done: true} 返回值是5
  • async/await(Es7)

// yield-runner-blue 库的使用
//http 请求中用
runner(function *(){ //不可以用箭头函数
    let arr1 = yield $ajax({url:'1.txt'.dataType:'json'});
    console.log(arr1);
    let arr2 = yield $ajax({url:'2.txt'.dataType:'json'});
    console.log(arr2);
    console.log('read over');
});
//async/await的使用
官方的runner版本 (去掉*,可以用箭头函数,yield 换成 await)
((async)=>{
    let arr1 = await $ajax({url:'1.txt'.dataType:'json'});
    console.log(arr1);
    let arr2 = await $ajax({url:'2.txt'.dataType:'json'});
    console.log(arr2);
    console.log('read over');
})();
  • 模块化

    • 民间的 sea.js(CMD ), require.js(AMD)
    • node.js
    • Es6 模块化

作用

  • 解决文件依赖
  • 按需引用
//新建index.html 引入sea.js,新建test.js
//test.js
define(function(require,exports,module){
    //var other = require('a.js'); 其他依赖模块
    exports.a = 23; //单个导出
    module.exports ={ //批量导出
        b:12,
        c:22,
        show(b,c){
            console.log(b+c);
        };
    }
});
//index.html
sea.use(['test.js'],function(mod){
    console.log(mod.a);//23
    mod.show();//34
})

总结

Es6的新特性使代码更加简明易懂,,加快了编码效率,让编码更加规整。

1人推荐
随时随地看视频
慕课网APP