JS高级-ES6语法与箭头函数-数组迭代方法

345 阅读8分钟

==01-ES6语法新特性介绍==

  • 1.ES6全称:ECMAScript-2015, 是2015年推出的全新的js语法
  • 2.一定要切记: 语法的更新,其实就是在原有的语法基础上新增了几个新的语法。 而不是说把我们之前学习的js语法给完全替换覆盖
    • 因此,我们学习ES6语法之后,相当于就是在之前的语法基础上,在额外多学几个js语法而已。 现在几乎很少有人会把ES5与ES6分的非常清楚。 基本上直接拿来用就可以了,哪个方便用哪个。

1.1-变量声明let与const


1.学习目标 : 掌握ES6新增两个关键字 let 与 const

  • let 与 const的作用是声明变量,类似于ES5的let关键字

2.学习路线(对比法学习)

(1) 复习ES5的let关键字两个特点

(2) 介绍ES6的let与const关键字的两个特点

(3) 介绍let与const的区别 与 注意点

//1.声明变量关键词

  1. ES5声明变量 var

1.1有变量预解析

1.2没有块级作用域

  1. ES6声明变量 let const
    1. 1.1没有变量预解析
    2. 有块级作用域
  2. let与const区别
    1. let:变量. 可以修改
    2. const: 常量 不可以修改
    3. 实际开发中,只要不修改的变量都用const,需要改的时候用let

1.2-解构赋值语法


==解构赋值语法 : 其实就是变量赋值语法的简写形式==

1.2.1-对象的解构赋值

解构赋值: 变量赋值的简写(解构精髓:当变量名 和 对象属性值一致的时候,只需要写一个)

  1. 取出对象的属性 赋值给 变量
 let obj = {
            name:'张三',
            age:20,
            sex:'男'
        }
let {name,age,sex,score} = obj
        console.log(name,age,sex,score)

2.取出变量的属性 赋值给 对象

let username = 'admin'
        let password = '123456'
let p = {
            username,// username:username
            password,
            say(){
                console.log(111)                
            }//say:function(){}
        }

        console.log(p)
        p.say()

1.2.2-数组解构赋值

/*数组解构

1.取出数组元素 赋值给变量

2.取出变量的值 赋值给数组元素

 let arr = [10,20,30]

        //ES5
        // let n1 = arr[0]
        // let n2 = arr[1]
        // let n3 = arr[2]
        // let n4 = arr[3]
        //ES6
        let [n1,n2,n3,n4]  = arr
        console.log( n1,n2,n3,n4)//10 20 30 undefined

        //取出变量的值 赋值给数组
        let num1 = 1
        let num2 = 2
        let arr1 = [num1,num2]

1.2.3-函数参数解构赋值

/* 函数参数解构: 当函数参数是对象类型,就可以对形参进行解构 */

//传参本质: 实参给形参赋值
         function fn(obj){// let obj = {name:'张三',age:20,sex:'男'}
            console.log( obj )
            //对函数形参进行解构
            let {name,sex,age} = obj
            console.log( name,sex,age )
         }

         function fn1( {name,sex,age} ){// let {name,sex,age} = {name:'张三',age:20,sex:'男'}
            console.log( name,sex,age )
         }

         fn( {name:'张三',age:20,sex:'男'} )
         fn1( {name:'张三',age:20,sex:'男'} )

1.3-箭头函数


1.箭头函数 : 相当于 function函数的简写

(1)去掉function,改成 箭头 => (2)形参小括号写到箭头左边

2.箭头函数语法注意点

2.1 如果箭头函数只有一个形参,则可以省略小括号

2.2 如果箭头函数的 函数体 只有一行代码,则可以省略大括号。 (此时必须省略return)

let fn = (a,b) => {
        console.log(a+b)
      }

      fn(10,20)

      //(1)如果箭头函数只有一个形参,则可以省略小括号
      let fn1 = a=>{
          console.log(a*2)
      }
      
      fn1(66)

      //(2)如果箭头函数的 函数体 只有一行代码,则可以省略大括号。 (此时必须省略return)
      let fn2 = a=>a*2
      
      let res = fn2(88)
      console.log(res)

1.4-箭头函数中的this


1.function函数this有三种指向 : 谁 调用我 , 我就指向谁

普通函数: 函数名() this -> window

对象方法: 对象名.函数名() this -> 对象名

构造函数: new 函数名() this -> new创建实例

2.箭头函数this : 没有this

  • 箭头函数本质是访问 上级作用域中的this
let fn = ()=>{
            //1级
            console.log( this )
        }

        fn()

        let obj = {
            name:'张三',
            eat:fn
        }

        obj.eat()

        //由于箭头函数没有this,所以箭头函数不能作为构造函数 (new会修改this指向,而箭头没有this)
        // new fn()
        //箭头函数也无法修改this (call apply bind)对箭头函数是无效的
        fn.call({name:'张三'})
        //由于箭头函数没有this,所以箭头函数一般不作为事件处理函数

1.5-展开运算符


1.展开运算符: ...

相当于对象遍历的简写

2.应用

2.1 连接两个数组

2.2 求数组最大值

let arr1 = [10,20,30]
        let arr2 = [40,50,60]

        //ES5 :  concat()
        // let arr = arr1.concat(arr2)
        // arr.push(70)
        //ES6
        let arr = [...arr1,...arr2,70]
        console.log( arr )

        //求数组最大值

        let max = Math.max(...arr1,...arr2)
        console.log( max )

1.6-数据类型Set


数据类型 Set : 集合

  • Set相当于是数组类型, 和数组Array唯一的区别是不能存储重复元素

场景 : 数组去重

let newArr = [ ...new Set(需要去重的数组) ]

//题: 一行代码实现数组去重

let newArr = [...new Set( arr ) ]

console.log(newArr)

let arr = [10,20,30,50,60,88,20,50,60,90]
        console.log( arr )

        //1.创建Set,去除数组重复元素
        // let set = new Set( arr )
        // console.log( set )
        //2.把set变成真数组
        // let newArr = [...set]

//经典面试题目
 let obj = {
        name: "ikun",
        eat() {
          //1级   this : obj
          function fn1() {
            //2级  
            console.log(this)//window  
          }
          fn1()
          let fn2 = () => {
            //2级  : 箭头函数访问上级 1级obj
            console.log(this)//obj   
          }
          fn2()
        },
        learn: () => {
          //1级 : 上级 this->window
          function fn1() {
            console.log(this)//window 
          }
          fn1()
          let fn2 = () => {
            //2级  访问1级 this -> window  
            console.log(this)//window  
          }
          fn2()
        }
      }

      obj.eat()
      obj.learn()

02-数组迭代方法

官网文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array

以下所有的方法,都可以使用传统的for循环来代替,只是语法不同而已

看图理解

1.1-数组map遍历


1.数组map方法作用: 映射数组

说人话:按照某种映射关系, 把数组的每一个元素给修改了

举例:全场8折: 数组的每一个元素 * 0.8

  1. map方法特点

2.1 回调函数执行次数 == 数组长度

2.2 回调函数内部的return

  • return 新数组的元素

  • 如果没有return, 则map的返回值都是undefined

2.3 map方法的返回值

  • 返回映射之后的新数组
let arr = [88, 90, 100, 20, 50]
        //完整写法
        let res = arr.map((item, index) => {
            return item * 0.8
        })
        //箭头函数如果形参只有一个可以省略小括号, 如果函数体只有一行可以省略大括号(必须省略return)
        let res1 = arr.map(item => item * 0.6)
        console.log(res1)

1.2-数组filter遍历


1.数组filter方法作用: 筛选数组

  • 应用场景: 筛选数组,将符合条件的元素放入新数组中

  • 举例: 找出数组中所有大于10的元素

  1. filter方法特点

2.1 回调函数执行次数 == 数组长度

2.2 回调函数内部的return

  • return true : 符合筛选条件,放入新数组中

  • return false : 不符合筛选条件,不放入新数组中

2.3 filter方法的返回值

  • 返回筛选之后的新数组
 let arr = [ 88,90,100,20,50 ]
       //需求:找出50以上的元素
        //完整写法
    //    let res = arr.filter( (item,index)=>{
    //         if( item >= 50 ){
    //             return true
    //         }else{
    //             return false
    //         }
    //    })

    let res = arr.filter(item=>item >= 50)
    console.log( res )

1.3-数组forEach遍历


1.数组forEach方法作用: 遍历数组

  • 应用场景: 和 for(let i=0;i<arr.length;i++){} 功能一致
  1. forEach方法特点

2.1 回调函数执行次数 == 数组长度

2.2 回调函数内部的return

  • 没有返回值

2.3 forEach方法的返回值

  • 没有返回值
let arr = [45,60,88,90,20]

       arr.forEach((item,index)=>{
           console.log(item,index)
       })

1.4-数组some遍历


1.数组some方法作用: 判断数组中是否有符合条件的元素

  • 应用场景: 非空判断(判断多个表单元素,有没有空文本)

  • 举例 : 判断数组中有没有负数

  1. some方法特点

2.1 回调函数执行次数 != 数组长度

2.2 回调函数内部的return

  • return true : 循环结束。 找到了满足条件的元素

  • return false : 循环继续。 没找到,循环继续。 如果所有元素全部遍历还是没找到,最终结果就是false

2.3 some方法的返回值

  • true : 有符合条件的元素

  • false : 没有符合条件的元素

let arr = [10,20,50,60,70,80]
       //标准写法
    //    let res = arr.some((item,index)=>{
    //        if( item < 0 ){
    //            return true
    //        }else{
    //            return false
    //        }
    //    })
        
        //简写
       let res = arr.some(item=>item < 0)
       console.log( res )

1.5-数组every遍历


1.数组every方法作用: 判断数组中 是否所有的 元素都满足条件

  • 应用场景: 开关思想 (购物车全选框)

  • 举例 : 判断数组中是不是都是正数

  1. every方法特点

2.1 回调函数执行次数 != 数组长度

2.2 回调函数内部的return

  • return true : 循环继续, 满足条件,如果所有的元素全部遍历还是true,则最终的结果就是true

  • return false : 循环结束。 只要要到不满足条件的元素,循环结束。最终的结果false

2.3 every方法的返回值

  • true : 所有的元素 都符合条件

  • false : 有元素 不符合条件

let arr = [10,20,50,60,70,80]
       //标准写法
       let res = arr.every((item,index)=>{
           if( item >= 0 ){
               return true
           }else{
               return false
           }
       })
       console.log(res)

1.6-数组findindex方法


1.数组findIndex方法作用: 查找元素的下标

  • 数组的findIndex与indexOf异同点

相同点:功能一致,都是查找元素下标。 有则返回下标,无则返回固定值-1

不同点:应用场景不同

indexOf : 查找数组中的元素都是值类型

findIndex : 查找数组中的元素都是引用类型

  1. findIndex方法特点

2.1 回调函数执行次数 != 数组长度

2.2 回调函数内部的return

  • return true : 循环结束。 找到了,此时返回值就是下标

  • return false : 循环继续。 没找到,循环继续。 如果所有元素全部遍历还是没找到,最终结果就是-1

2.3 some方法的返回值

  • 元素下标 或者 -1
let arr = [
           {name:'张三',age:20},
           {name:'李四',age:18},
           {name:'王五',age:16},
       ]

       //需求:找名字为王五的人在哪里
    //    let res = arr.findIndex(item=>{
    //        if( item.name == 'sfs' ){
    //            return true
    //        }else{
    //            return false
    //        }
    //    })

      let res = arr.findIndex(item=>item.name == '王五')
      console.log(res)

1.7-数组reduce方法(难点)


1.数组reduce方法 : 数组累加器方法

  • 对数组每一个元素执行一次回调函数,累加最后一次回调的结果

2.reduce场景: 数组元素求和、求数组元素最大值

 let arr = [20,55,60]

        // let sum = 0
        // for(let i = 0;i<arr.length;i++){
        //     sum = sum + arr[i]
        // }
        // console.log( sum )
        

        /* 
        第一个参数:回调   (上一次值,当前值,当前下标)=>{}
            * 默认下标不是从0开始,而是从1开始。 开发中一般需要设置默认值
            * return 值 就是下一次 sum的值
        第二个参数: 初始值
            * 一般需要设置初始值为0, 如果不设置遇到空数组则会报错
        reduce方法返回值是 : 最后一次sum的结果
        */
    //    let res = arr.reduce( ( sum,item,index )=>{
    //         console.log( sum,item,index)
    //         return sum + item
            
    //     } , 0 )

        let res = arr.reduce( ( sum,item )=>sum + item , 0 )

        console.log( res )