1.什么是ES6

ES全称是ECMAScript。它是由ECMA国际标准化组织,制定的一套脚本语言的标准化规范。

ES6实际上是一个泛指,泛指ES2015及后续的版本。但是本章我们学的是ES2016。

 

2.为什么要学习ES6

每一次标准的诞生都意味着语言的完善、功能的加强。JavaScript语言本身就存在很多令人不满意的地方。

函数较少、很多功能需要自己去写

语法松散,实现相同的功能,不同的人可能会写出不同的代码。

 

3.ES6新语法

3.1Let

Let关键字是ES6中新增的一个声明变量的关键字。

Let声明的变量只在所处于的块级有效,作用范围变得更小了

<script>
    if(true) {
      let a = 10
    }
    console.log(a)
  </script>

注意:使用let关键字声明的变量才有块级作用域的作用,var声明的不具备这个特性。

Let声明的变量不存在变量提升

<script>
    console.log(a)
    let a = 10
  </script>

 

暂时性死区

<script>
    var temp = 123
    if(true) {
      temp = 'abc'
      let temp
      console.log(temp)
    }
  </script>

 

经典面试题

<script>
    var arr = []
    for(var i = 0; i < 2; i++) {
      arr[i] = function() {
        console.log(i)
      }
    }
    arr[0]()
    arr[1]()
  </script>

 

此题的关键点在于var i是全局的。函数运行的时候作用是输出i,此时i是2

<script>
    var arr = []
    for(let i = 0; i < 2; i++) {
      arr[i] = function() {
        console.log(i)
      }
    }
    arr[0]()
    arr[1]()
  </script>

该代码使用let声明i,那么,每次循环的时候都会产生一个块级作用域,每个块级作用域中变量都是不同的,互不影响。

 

3.2Const

作用:声明一个常量。常量就是值(内存地址)不能改变的量。

Const也具有块级作用域。

<script>
    if(true) {
      const a = 10
    }
    console.log(a)
  </script>

声明常量的时候必须赋值,并且,常量赋值后,值不能修改

<script>
    const a = 10
    a = 100
  </script>

一个const的数组。我们是否可以改变里面的元素?答案是可以。因为数组本身没有被改变,地址也没有被修改,只是修改了里面的元素。

<script>
    const arr = [1,2,3]
    console.log(arr)
    arr.push(4)
    console.log(arr)
    arr[0] = 'hahaha'
    console.log(arr)
    arr = [1,2,3] // 报错
  </script>

 

3.3Var、let、const区别

  1. 使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象。
  2. 使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升。
  3. 使用const声明的常量,在后面的代码中不能再修改常量的值。

 

3.4解构赋值

ES6中允许从数组、对象中提取值,按照对应的位置,对变量赋值

<script>
    const arr = [1,2,3]
    let [a,b,c] = arr
    console.log(a) // 1
    console.log(b) // 2
    console.log(c) // 3
  </script>

 

如果结构不成功,变量的值是undefined

对象解构

<script>
    const person = {
      id: 1,
      name: '张三',
      age: 23
    }
    const {name, age, id:myId} = person
    console.log(name)
    console.log(age)
    console.log(myId) // myId是在解构时赋予的别名
  </script>

 

3.5箭头函数

ES6中定义函数的新方式

语法:() => {}

<script>
    function add(num1, num2) {
      return num1 + num2
    }
    const num = add(1,2)
    console.log(num)
    const a = (num1, num2) => {
      return num1+num2
    }
    console.log(a(1,2))
  </script>

 

函数体中如果只有一句代码,并且代码的执行结果就是返回值,可以省略大括号

var fun = function(a) {
      console.log(a)
    }
    fun(2)
    const fun2 = a => console.log(a)
    fun2(4)

 

箭头函数不绑定this关键字,箭头函数中的this指向的是函数定义位置的上下文。

<script>
    class Person {
      constructor(name) {
        this.name = name
      }
      say() {
        console.log('say中', this)
        return () => {
          console.log('function中', this)
        }
      }
    }
    const p = new Person('张三')
    const r = p.say()
    r()
  </script>

 

3.6剩余参数

剩余参数语法允许我们将一个不定数量的参数表示为一个数组

<script>
    function sum(first, ...args) {
      //...表示剩余参数
      console.log(first)
      console.log(args)
    }
    sum(10,20,30)
  </script>

剩余参数一般和解构一起使用

<script>
    const objArr = [
      {id: 1, name: '张三', age: 23},
      {id: 2, name: '李四', age: 24},
      {id: 3, name: '王五', age: 25},
      {id: 4, name: '赵六', age: 26}
    ]
    const tempArr = [
      {id: 5, name: '田七', age: 27},
      {id: 6, name: '王八', age: 28},
      {id: 7, name: '老九', age: 29}
    ]
    // 把tempArr的元素全部放到objArr中
    // objArr.push(tempArr) // 错的
    // tempArr.forEach(e => {
    //   objArr.push(e)
    // }) // 可以,但是还是有点麻烦
    objArr.push(...tempArr) // 使用...和解构的方式
    console.log(objArr)
  </script>

 

4.ES6中内置对象的扩展

4.1Array扩展方法

扩展运算符(展开语法)

扩展运算符可以将数组或者对象转为用逗号分隔的参数序列

<script>
    const objArr = [
      {id: 1, name: '张三', age: 23},
      {id: 2, name: '李四', age: 24},
      {id: 3, name: '王五', age: 25},
      {id: 4, name: '赵六', age: 26}
    ]
    console.log(...objArr)
  </script>

 

构造函数方法:Array.from()

将类数组或者可比案例对象转换为真正的数组

<script>
    const arr = ['a', 'b', 'c', 'd']
    console.log(arr)
    const obj = {
      '0': 'a',
      '1': 'b',
      '2': 'c',
      '3': 'd',
      length: 4
    }
    const objArr = Array.from(obj)
    console.log(objArr)
  </script>

 

From方法有第二个参数,作用类似于数组中的map方法,用来对每个元素进行处理,将处理后的值,放入返回的数组

<script>
    const obj = {
      '0': 1,
      '1': 2,
      '2': 3,
      length: 3
    }
    const objArr = Array.from(obj, item => item * 2)
    console.log(objArr)
  </script>

 

 

 

4.2实例方法:find()

用于找出第一个符合条件的数组成员,如果没有找到,返回undefind

<script>
    const objArr = [
      { id: 1, name: '张三', age: 23 },
      { id: 2, name: '李四', age: 24 },
      { id: 3, name: '王五', age: 25 },
      { id: 4, name: '赵六', age: 26 }
    ]
    const a = objArr.find(item => item.id > 2)
    console.log(a)
    const resultArr = objArr.filter(item => item.id < 3)
    console.log(resultArr)
  </script>

 

4.3实例方法:findIndex()

用于找出第一个符合条件的数组成员的位置,如果没有找到,就返回-1

<script>
    const objArr = [
      { id: 1, name: '张三', age: 23 },
      { id: 2, name: '李四', age: 24 },
      { id: 3, name: '王五', age: 25 },
      { id: 4, name: '赵六', age: 26 }
    ]
    const index = objArr.findIndex(e => e.id > 2)
    console.log(index)
  </script>

 

4.4实例方法:includes()

表示某个数组是否包含给定的值

<script>
    console.log([1,2,3].includes(2))
    console.log([1,2,3].includes(4))
  </script>

 

4.5模板字符串

ES6中新增了创建字符串的方式。使用反引号定义。``

在模板字符串中,可以解析变量

<script>
    let name = `zhangsan`
    console.log(name)
    let hello = `hello, my name is ${name}`
    console.log(hello)
  </script>

 

在模板字符串中,可以调用函数。

<script>
    let name = `zhangsan`
    console.log(name)
    const fun = () =>  '我的名字是张三'
    let hello = `hello, my name is ${name}, ${fun()}`
    console.log(hello)
  </script>

 

在模板字符串中,可以拼接字符串,可以任意的换行。

<script>
    class Goods {
      constructor(id, name, price) {
        this.id = id
        this.name = name
        this.price = price
      }
    }
    var dataList = [
      new Goods(1, '篮球', 10.8),
      new Goods(2, '足球', 50.4),
      new Goods(3, '乒乓球', 5),
      new Goods(4, '羽毛球', 9),
      new Goods(5, '网球', 16),
      new Goods(6, '排球', 8),
      new Goods(7, '美式足球', 26)
    ]
    $(function() {
      let table = $("#goods-table")
      let html = ''
      // dataList.forEach(e => { // 拼接字符串,相当的麻烦,而且字符串复杂时,容易拼错
      //   let temp = '<tr>' +
      //     '<td>'+ e.id +'</td>' +
      //     '<td>'+ e.name +'</td>' +
      //     '<td>'+e.price+'</td>' +
      //     '</tr>'
      //   html += temp
      // })
      dataList.forEach(e => {
        html += `
          <tr>
            <td>${e.id}</td>
            <td>${e.name}</td>
            <td onclick='clickPrice(${e.price})'>${e.price}</td>
          </tr>
        `
      })
      table.append(html)
    })
  </script>

 

4.6实例方法startsWith和endsWith

startsWith():表示参数字符串是否在指定字符串的头部

endsWith():表示参数字符串是否在指定字符串的尾部

<script>
    const str = 'hello world!'
    console.log(str.startsWith('hello'))
    console.log(str.endsWith('!'))
    console.log(str.startsWith('稽哥最帅'))
  </script>

 

4.7实例方法startsWith和endsWith

Repeat方法表示将原字符串重复n次,返回一个新的字符串

<script>
    const str = '稽哥最帅'
    const s = str.repeat(3)
    console.log(s)
  </script>

 

4.8Set数据结构

ES6提供了新的数据结构,set。它类似于数组,但是成员的值都是唯一的,没有重复的值。

<script>
    const s = new Set()
    s.add(1)
    s.add(2)
    console.log(s)
  </script>

 

Set的构造函数还可以接收一个数组作为参数,用来初始化。

<script>
    const s = new Set([1,2,3,4,4])
    console.log(s)
  </script>

 

Add(value):添加一个值,返回的set本身

Delete(value):删除某个值,返回一个布尔类型,表示是否删除成功

Has(value):返回一个布尔值,表示该value是否是set的成员

Clear():清除所有成员,没有返回值

 

<script>
    const s = new Set([1,2,3,4,4])
    s.add(5)
    s.delete(4)
    console.log(s.has(3))
    console.log(s)
    s.clear()
    console.log(s)
  </script>

遍历

Set结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作