一、ECMAScript6简介

1.ES6是什么

ES6是JavaScript的最新版本

JavaScript包含:
    ECMAScript   JavaScript的语法部分   ES3-ES5
    BOM
    DOM
    
常见面试题:
ES和js的关系:
ES是JavaScript的标准;JavaScript是ES的实现。

ES6是2015年发布的新一版本的JavaScript,又称为:ES2015

2.ES的版本问题

2015年   ES2015   ES6  划时代的版本
2016     ES2016   ES7
2017     ES2017   ES8
2018     ES2018  ...
...
2021     ES2021

3.ES6与ES5之间的关系

ES6是ES5 的语法糖。ES6的所有功能,使用ES5都可以实现,但是使用ES6更加简单、简介、标准化.

 

4.ES6和ES5有哪些差异

新增:

  • 类 class
  • 继承
  • ...运算符
  • 解构
  •  

改变:

  • 变量
  • 函数
  • 数组
  • 字符串
  • 对象

5.总结

学了ES6,就忘了ES5

二、变量的扩展:let和const

2.1 let

let 是ES6中新增一个用来定义变量的关键字

let和var的区别:

  • var有变量提升 let没有变量提升(先声明,再使用)
  • var 允许变量重复定义 let不允许变量重复定义
  • var 定义的变量属于函数作用域、let定义的变量属于块作用域
  • let定义的变量有暂时性死区,var没有
//暂时性死区
        function show(){
            console.log(a);//暂时性死区
            //....
            let a=10;
            // console.log(a);
        }

        show();
  • var定义的变量会变成顶级对象(window)的属性,let不会

 

应用:let和for循环

let lis = document.querySelectorAll('ul li');
        for (let i = 0; i < lis.length; i++) {
            lis[i].onclick = function () {
                alert(i);
            }
        }

解析(了解)

//上面代码可以拆分为如下:
        //系统每一次都会产生一个新的变量,来保存上一次变量的值,并且赋值给下一次的循环

        {
            let i = 0;
            // let temp;
            {
                lis[0].onclick = function () {
                    alert(i)
                }
                // i++;
                temp = ++i;
            }

            {
                // let i = 1;
                i = temp;
                lis[1].onclick = function () {
                    alert(i)
                }
                temp = ++i;
            }

            {
                // let i = 2;
                i = temp;
                lis[2].onclick = function () {
                    alert(i)
                }
                temp = ++i;
            }

            {
                let i = temp;
                lis[3].onclick = function () {
                    alert(i)
                }
                temp = ++i;
            }
        }

 

2.2 const

const使用来定义常量。

let所拥有的的特点,const都有。

const特点:

  • 不允许被重新赋值
  • 常量必须在定义的时候,就初始化(赋值)
  • 建议:const定义的常量的名称,一般为大写

用途:

用于定义项目中的公共内容、变量

三、字符串的扩展

3.1.反引号

ES6中新增了通过反引号来定义字符串

特点:

  • 支持换行
  • 支持使用${}在字符串中插入变量
``

示例:

let arr = [
            { id: 1, name: "李逵", age: 30 },
            { id: 2, name: "李四", age: 40 },
            { id: 3, name: "李鬼", age: 50 },
            { id: 4, name: "李某", age: 20 },
        ];
        //将数据展示到页面中
        let s = '';
        arr.forEach(function (item) {
            // console.log(item);
            s += ` <li><span>${item.id}</span>---- <span>${item.name}</span> --- <span>${item.age}</span></li>`
        });

        document.querySelector('ul').innerHTML = s;

3.2 字符串新增的方法

  • includes() 判断字符串中是否包含指定的字符 true false
  • padStart(length,str) 使用参数str来在字符串的头部添加内容,添加之后字符串的长度为第一个参数
    示例:
var s = 'hello';
    var s1 = s.padStart(7, '你好啊嘿呵');//新字符串长度为7

    console.log(s1);
  • trim() 祛除字符串首尾空格

四、变量解构赋值

在 ES6中允许按照一定的模式来解析数组、对象,赋值给变量,这种解析模式称为:解构赋值。

解构的诀窍:

  • 保证=两边的模式一致 [],{}
  • 将=右边的内容解析赋值左边的变量

 

4.1 数组的解构

数组特点:有序的哈希结构

let arr = [1, 2, 3];//模式一致
        let [a, b, c] = arr;//按顺序解构

        // console.log(a, b, c);

分析:数组是一种有序的结构,在解析数据的时候,按照顺序来解析和赋值(一一对应的关系)

数组的常见解构:

  • 完全解构
  • 不完全解构
  • 解构失败
  • 解构变量默认值
  • 解构的缺省
//1.完全解构(变量的个数与数据个数一致)
        // let [a, b] = [10, 20];

        // console.log(a, b);

        //2.不完全解构(变量的个数少于数据的个数)
        // let [a] = [10, 20];
        // console.log(a);

        //3.解构失败(变量的个数多于数据的个数)
        let [a, b, c] = [10, 20]
        console.log(a, b, c);

        //4.解构的默认值
        let [a=0, b=0, c = 0] = [10, 20];//c默认值为0
        // let [a, b, c = 0] = [10, 20,30]
        console.log(a, b, c);

        //5.解构的缺省
        let [, , , b] = [10, 20, 30, 40];

 

4.2 对象解构

对象是无序的哈希结构.对象的解构需要借助属性名来做。

语法:

let {属性名1:变量,属性名2:变量}=对象;

常见的情况:

  • 完全解构
  • 不完全解构
  • 解构失败
  • 解构默认值

示例:

//1.完全解构(变量个数与对象的属性个数一致)
        // let { code: a, msg: b, data: c } = obj;
        // console.log(a, b, c);

        //2.不完全解构
        // let { data: rst } = obj;
        // console.log(rst);

        //3.解构失败
        // let { code: a, msg: b, data: c, info: d } = obj;
        // console.log(d);

        //4.解构默认值
        let { code: a, msg: b, data: c = [], info: d = '' } = obj;
        console.log(d);//''
        console.log(c);

注意:若对象的属性名和变量保持一致,则可以简化对象的解构写法:

let obj = {
            code: 200,
            msg: "ok",
            data: [10, 20, 3]
        }
        //对象解构的简化写法
        // let { code: code, msg: msg, data: data } = obj;
        //对象的属性名和变量的名称保持一致,可以简化为如下形式:
        let { code, msg, data } = obj;
        console.log(code, msg, data);

4.3 解构的应用

1.交换数据

//a =5  b=3  不使用第三个变量的前提下,交换a,b变量的值
        let a = 5;
        let b = 3;

        // a = a + b;//8
        // b = a - b;//5
        // a = a - b;//3
        [a, b] = [b, a];

        console.log(a, b);

2.解析数据


        let obj = {
            code: 200,
            msg: "成功",
            data: [
                [
                    { id: 1, names: "jack" }
                ],
                [],
                []
            ]
        };
    let { code = '', msg = '', data = '' } = obj;//快速取值,有默认值
        // let { data } = obj;
        // // console.log(data);
        // let [a] = data;
        // let [b] = a;
        // let { names } = b;
        // console.log(names);

        //复杂解构(了解)
        let { data: [[{ names }]] } = obj;
        console.log(names);

 

4.4 解构和函数

数组示例:

// function show(a,b){
        //     console.log(a+b);
        // }


        // function show1(arr){
        // //    let s= arr.reduce(function(a,b){
        // //         return a+=b;
        // //     },0)
        // //     console.log(s);
        // }

        // function show1([a = 0, b = 0]) {
        //     // let [a, b] = arr;
        //     console.log(a + b);
        // }

        // show1([10])
        // show1([10, 20])
        // show1([])
        // show1();//错误做法  保证=两边的模式一致

        // // [a,b]=[10,20]
        // [a,b]=undefined;//error

对象的解构和函数的参数:

// function show(a, b, c) {
        //     console.log(a + 1);
        //     console.log(b + 1);
        //     console.log(c + 1);
        // }


        // show(10, 20, 30);//参数有序
        // show(10,, 30);//不能省略


        //传递对象作为参数  参数的顺序问题
        // function show(obj) {
        //     console.log(obj.a + 1);
        //     console.log(obj.b + 1);
        //     console.log(obj.c + 1);
        // }

        function show({ a=0, b = 0, c=0 }) {
            console.log(a + 1);
            console.log(b + 1);
            console.log(c + 1);
        }

        show({
            a: 10,
            // b: 20,
            c: 30
        });

 

拓展知识

数组的迭代方法:

  • forEach(callbackfn)
  • 参数说明:callbackfn 回调函数;该回调函数最多可以接收三个参数,分别是:value,index,arr

示例:

arr.forEach(function (value) {//推荐
            console.log(value);
            return;
        })

注意:forEach不能被return打断

  • some(callbackfn) 遍历数组,判断数组中是否有元素满足条件;有一个满足,返回true,都不满足,返回false
  • 参数:回调函数;该回调函数最多可以接收三个参数,分别是:value,index,arr

示例:

var arr = [10, 201, 301, 1000];
        var rst = arr.some(function (v) {//v 数组中的每个元素
            return v > 200;
        });
  • every() 遍历数组,判断数组中是否每一个元素都满足条件;满足返回true;有一个不满足则返回false
    示例:
var rst=arr.every(function(value){
            return value>200;
        })
  • map() 遍历数组;返回的结果会组成一个新的数组返回

示例:

//4.4  map 遍历数组,为每一个元素都进行操作之后,返回由新元素组成的数组
        // var arr = [10, 20, 30, 900];
        // var arr0=arr.map(function(v){
        //     return v+10;
        // })
        // console.log(arr0);
  • filter() 遍历数组;将数组中满足过滤条件的元素返回,组成新数组
    示例:
var arr = [10, 20, 30, 40, 100, 99];
        var arrx = arr.filter(function (v, i) {
            // console.log(v,i);
            return v > 60;//条件
        });

        console.log(arrx);
  • arr.reduce(callbackfn,initvalue) 返回累加结果
  • 参数说明:callbackfn 回调函数 initvalue 回调函数第一个参数的初始值
  • 用法一:initvalue没有赋值,
  • 回调函数第一次执行的时候,第一个参数的值为数组的第一个元素,第二个参数的值为数组的第二个元素
  • 非第一次遍历,则回调函数的第一个参数为上一次累加的结果,第二个参数为当遍历的元素
// var arr=[11,22,55,200,300];
        // //累加器
        // var sum=arr.reduce(function (a, b) {
        //     // console.log(a, b);
        //     // return a+b;
        //     return a*b;
        // });
  • 用法二:initvalue有初始值
  • 遍历时,回调函数的第一个参数为默认值,第二个参数为当前遍历的元素;依次类推
let arr = [
            { id: 1, name: "李逵", age: 30 },
            { id: 2, name: "李四", age: 40 },
            { id: 3, name: "李鬼", age: 50 },
            { id: 4, name: "李某", age: 20 },
        ];

        let s = arr.reduce(function (s, item) {
            return s += ` <li><span>${item.id}</span>---- <span>${item.name}</span> --- <span>${item.age}</span></li>`
        }, '')