一、简介

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

ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里并没有类的概念,但是目前浏览器的 JavaScript 是 ES5 版本,大多数高版本的浏览器也支持 ES6,不过只实现了 ES6 的部分特性和功能。

二、 特性

1. let

新增加的声明变量的关键字,与var声明变量有以下不同

  • 声明的变量有严格局部作用域
{
            var a = 102;
            let b = 2;
        }
        console.log(a);  // 1
        console.log(b);  // ReferenceError: b is not defined
  • var 可以声明多次,let 只能声明一次
var m = 1
        var m = 2
        let n = 3
        let n = 4
        console.log(m)  // 2
        console.log(n)  // Identifier 'n' has already been declared
  • var 会变量提升,let 不存在变量提升
console.log(x);  // undefined
        var x = 10;
        console.log(y);   //ReferenceError: y is not defined
        let y = 20;

2. const

  • 一但声明必须初始化,否则会报错
  • 声明之后不允许改变
const a = 1;
        a = 3; //Uncaught TypeError: Assignment to constant variable.

3. 解构表达式

  • 数组解构
    可以直接将数组的元素依次赋值给其他变量
let arr = [1,2,3];

		//不需要像下面这样挨个赋值
        // let a = arr[0];
        // let b = arr[1];
        // let c = arr[2];

        let [a,b,c] = arr;

        console.log(a,b,c) //1 2 3
  • 对象解构
    可以直接将对象的属性赋给其他变量
const person = {
            name: "jack",
            age: 21,
            language: ['java', 'js', 'css']
        }

        //			不需要像下面这样挨个赋值
        //         const name = person.name;
        //         const age = person.age;
        //         const language = person.language;


        //对象解构
        //将name的值赋给abc
        const { name:abc, age, language } = person;

        console.log(abc, age, language)

4. 字符串

  • 字符串扩展
    字符串可以使用startsWith()endsWithincludes等函数
let str = "hello.vue";
        console.log(str.startsWith("hello"));//true
        console.log(str.endsWith(".vue"));//true
        console.log(str.includes("e"));//true
        console.log(str.includes("hello"));//true
  • 模板字符串
    模板字符串相当于加强版的字符串,用反引号 `,除了作为普通字符串,还可以用来定义多行字符串,还可以在字符串中加入变量和表达式。
普通字符串:
        let string = `Hello'\n'world`;
        console.log(string); 
        // "Hello'
        // 'world"

        多行字符串:
        let string1 =  `Hey,
        can you stop angry now?`;
        console.log(string1);
        // Hey,
        // can you stop angry now?

        变量名写在 ${} 中,${} 中可以放入 JavaScript 表达式:
        function fun() {
            return "这是一个函数"
        }

        let info = `我是${abc},今年${age + 10}了, 我想说: ${fun()}`;
        console.log(info);
        //我是jack,今年31了, 我想说: 这是一个函数

5. 函数优化

  • 参数默认值
    在ES6以前,我们无法给一个函数参数设置默认值,只能采用变通写法;现在可以直接给参数写上默认值,没传就会自动使用默认值
//在ES6以前,我们无法给一个函数参数设置默认值,只能采用变通写法:
        function add(a, b) {
            // 判断b是否为空,为空就给默认值1
            b = b || 1;
            return a + b;
        }
        // 传一个参数
        console.log(add(10));


        //现在可以这么写:直接给参数写上默认值,没传就会自动使用默认值
        function add2(a, b = 1) {
            return a + b;
        }
        console.log(add2(20));
  • 不定参数
function fun(...values) {
            console.log(values.length)
        }
        fun(1, 2)      //2
        fun(1, 2, 3, 4)  //4
  • 箭头函数
var print = obj => console.log(obj);
        print("hello");


   		//箭头函数+解构
        const person = {
            name: "jack",
            age: 21,
            language: ['java', 'js', 'css']
        }
        
        var hello2 = ({name}) => console.log("hello," +name);
        hello2(person);

6. 对象优化

  • 对象的新方法
const person = {
            name: "jack",
            age: 21,
            language: ['java', 'js', 'css']
        }
		//key/values/entries方法
        console.log(Object.keys(person));//["name", "age", "language"]
        console.log(Object.values(person));//["jack", 21, Array(3)]
        console.log(Object.entries(person));//[Array(2), Array(2), Array(2)]
        
        const target = { a: 1 };
        const source1 = { b: 2 };
        const source2 = { c: 3 };

       	//assign将源对象的所有可枚举属性复制到目标对象中。
        Object.assign(target, source1, source2);
        console.log(target); //{a:1,b:2,c:3}
  • 声明对象简写
const age = 23
        const name = "张三"
        //原本声明对象
        const person1 = { age: age, name: name }
		
        //简写后(若属性名与常量名相同时才可以使用)
        const person2 = { age, name }
        console.log(person2);
  • 对象函数属性简写
    可以省略对象函数属性的声明,用箭头函数或者函数属性名代替函数声明
let person3 = {
            name: "jack",
            // 以前:
            eat: function (food) {
                console.log(this.name + "在吃" + food);
            },
            //箭头函数this不能使用,对象.属性
            eat2: food => console.log(person3.name + "在吃" + food),
            eat3(food) {
                console.log(this.name + "在吃" + food);
            }
        }
  • 对象扩展运算符
    可以用...object代表某个对象所有的属性进行操作
// 1、拷贝对象(深拷贝)
        let p1 = { name: "Amy", age: 15 }
        let someone = { ...p1 }
        console.log(someone)  //{name: "Amy", age: 15}

        // 2、合并对象
        let age1 = { age: 15 }
        let name1 = { name: "Amy" }
        let p2 = {name:"zhangsan"}
        p2 = { ...age1, ...name1 } 
        console.log(p2) //{age: 15, name: "Amy"}

7. map 和 reduce函数

  • map函数
    接收一个函数,将原数组中的所有元素用这个函数处理后放入新数组返回。
let arr = ['1', '20', '-5', '3'];
        arr = arr.map(item=> item*2); 
		console.log(arr);	//[2, 40, -10, 6]
  • reduce函数
    为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,
    arr.reduce(callback,[initialValue])callback函数可用四个参数
    1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
    2、currentValue (数组中当前被处理的元素)
    3、index (当前元素在数组中的索引)
    4、array (调用 reduce 的数组)
let arr =  [2, 40, -10, 6];
        let result = arr.reduce((a,b,index)=>{
            console.log("上一次处理后:"+a);
            console.log("当前正在处理:"+b);
            console.log(index);
            return a + b;
        },100);
        console.log(result)

		//控制台打印结果
        上一次处理后:100
        当前正在处理:2
        0
        上一次处理后:102
        当前正在处理:40
        1
        上一次处理后:142
        当前正在处理:-10
		2
        上一次处理后:132
        当前正在处理:6
        3

8. promise对象

当发送异步请求时,如果我们下一个异步请求需要用到上一个异步请求的结果,这个时候就会发生连续嵌套,非常混乱,而通过promise对象和then函数可以解决这一问题

原始的嵌套处理:

$.ajax({
            url:"mock/user.json",
            success:function(data){
                console.log("查到数据"+data.id)
                $.ajax({
                    url:`mock/user_corse_${data.id}.json`,
                    success:function(data){
                        console.log(data)
                    },
                    error:function(error){
                        console.log("出错。。"+error)
                    }
                });
            },
            error:function(error){
                console.log("出现异常"+error)
            }
        }   
              )

通过promise对象和then函数处理:

let p=new Promise((resolve,reject)=>{
            $.ajax({
                url:"mock/user.json",
                success:function(data){
                    console.log("查到数据"+data);
                    resolve(data);
                },
                error:function(err){
                    reject(err);
                }
            })
        });
        p.then(obj=>{
            $.ajax({
                url:`mock/user_corse_${obj.id}.json`,
                success:function(data){
                    console.log(data);
                }
            })
        })

9. 模块化

模块导入导出各种类型的变量,如字符串,数值,函数,类。

  • 导出的函数声明与类声明必须要有名称(export default 命令另外考虑)。
  • 不仅能导出声明还能导出引用(例如函数)。
  • export 命令可以出现在模块的任何位置,但必需处于模块顶层。
  • import 命令会提升到整个模块的头部,首先执行。
/*-----export [test.js]-----*/
let myName = "Tom";
let myAge = 20;
let myfn = function(){
    return "My name is" + myName + "! I'm '" + myAge + "years old."
}
let myClass =  class myClass {
    static a = "yeah!";
}
export { myName, myAge, myfn, myClass }
 
/*-----import [xxx.js]-----*/
import { myName, myAge, myfn, myClass } from "./test.js";
console.log(myfn());// My name is Tom! I'm 20 years old.
console.log(myAge);// 20
console.log(myName);// Tom
console.log(myClass.a );// yeah!