你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

JavaScriptES6新语法和数组迭代方法

2021/12/28 21:08:22

变量声明let与const

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* 
    1.学习目标 : 掌握ES6新增两个关键字 let 与 const
      * let 与 const的作用是声明变量,类似于ES5的let关键字
    2.学习路线(对比法学习)
      (1) 复习ES5的let关键字两个特点
      (2) 介绍ES6的let与const关键字的两个特点
      (3) 介绍let与const的区别 与 注意点
*/

      /* 1.ES5语法变量特点 */

      // 1.1 变量会提升
      console.log(num) //undefined
      var num = 10

      // 1.2 没有块级作用域
      for (var i = 1; i < 5; i++) {
        console.log('循环内' + i)
      }

      console.log('循环外' + i) //5

      /* 2.ES6新增两种变量声明方式(let与const),类似于let
     (1).不会提升
     (2).有块级作用域
*/

      // (1)如果打印undefined,说明提升了  (2)如果报错,说明没有提升
      // console.log(a);//报错
      // let a = 10;

      // (2)如果打印5,说明没有块级作用域  (2)如果报错,说明有块级作用域

      for (let j = 1; j < 5; j++) {
        console.log(j)
      }

      // console.log(j);

      /* 3.let与const区别
       * 注意点:ES6中变量不能重复声明,否则会报错
       */

      //let声明:变量,允许修改
      let a = 10
      a = 20
      // let a = 30;//程序报错,不允许重复声明
      console.log(a)

      //const声明:常量,只可以声明的时候赋值一次,之后无法修改
      const b = 100
      // b = 200;//程序报错
      console.log(b)
    </script>
  </body>
</html>

解构赋值语法

对象解构赋值

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* 
    1.学习目标:掌握对象的解构赋值语法
        * 解构赋值本质 就是 变量赋值语法的简写形式
    2.学习路径 : 对比法学习(ES5与ES6对比)
        (1)取出 对象的属性值 赋值给 变量
        (2)取出 变量的值 赋值给 对象的属性
        (3)设置 解构赋值语法 的默认值

*/

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

      //1:取出 对象的属性 赋值 给变量

      let obj = {
        name: '张三',
        age: 18,
        sex: '男'
      }

      /* ES5 */
      // let name = obj.name;
      // let age = obj.age;
      // let sex = obj.sex;
      // console.log(name,age,sex);

      /* ES6 */

      /* a.这行代码本质:声明三个变量 name,age,sex。取出右边obj对象对应的属性名赋值给左边的变量*/
      // let {name,age,sex} = obj;
      // console.log(name,age,sex);

      /* b.由于obj对象没有score属性,所以变量score的值为undefined。 */
      // let {name,score} = obj;
      // console.log(name,score);

      /* c. sex:gender 的含义 : let gender = obj.sex */
      // let {name,sex:gender} = obj;
      // console.log(name,gender);

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

      // let name = '李四';
      // let age = 20;
      // let sex = '男';
      // let sayHi = function(){
      //     console.log('你好');
      // };

      /* ES5  */
      // let person = {
      //     name : name,
      //     age : age,
      //     gender : sex,
      //     sayHi :sayHi
      // };
      // console.log(person);

      /* ES6 */
      // let person = {
      //     name,//等价于 name:name
      //     age,
      //     gender:sex,//如果属性名和变量名不一致,还是按照以前ES5的写法来赋值
      //     sayHi,
      //     play(){//等价于:play:function(){}
      //         console.log('学习使我快乐');
      //     }
      // };

      // console.log(person);

      //3. 设置 解构赋值语法 的默认值

      let student = {
        name: '班长',
        age: 38,
        sex: '女'
      }
      /* 
    (1)  name = '坤哥'   
        a. 声明变量name : let name;
        b. 取出student对象的name属性值赋值给name : student.name
        c. 如果student对象没有name属性则赋值坤哥 :   if(student.name){ name = student.name }else{ name = '坤哥' }
    
    (2) sex:gender = '男'
        a. 声明变量gender : let gender;
        b. 取出student对象的sex属性值赋值给gender : student.sex
        c. 如果student对象没有sex属性则赋值男 :   if(student.sex){ gender = student.sex }else{ gender = '男' }
    */
      let { name = '坤哥', score = 88, sex: gender = '男' } = student
      console.log(name, score, gender) //班长 88 女
    </script>
  </body>
</html>

数组解构赋值

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <script>
      //数组解构赋值

      let arr = [10, 20, 30]

      /* ES5 */
      // let n1 = arr[0];
      // let n2 = arr[1];
      // let n3 = arr[2];

      // console.log(n1,n2,n3);

      /* ES6 */
      let [n1, n2, n3 = 50, n4 = 100] = arr
      console.log(n1, n2, n3, n4) // 10 20 30 100
    </script>
  </body>
</html>

函数参数解构赋值

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* 
    1.学习目标 : 掌握函数参数的解构赋值
    2.学习路线
        (1)复习 函数 传参的本质是 实参给形参赋值的过程
        (2)使用解构赋值语法 给函数传参
        (3)使用解构赋值语法 设置 函数的默认参数
    */

      /* (1) ES5 :函数传参  */

      /**
       * @description:
       * @param {Object}  obj:对象类型  {name:名字 age:年龄 sex:性别}
       * @return:
       */
      // function fn(obj){
      //     console.log(obj);
      //     //声明三个变量接收对象的参数值
      //     let name = obj.name;
      //     let age = obj.age;
      //     let sex = obj.sex;
      //     console.log(name,age,sex);
      // };

      // fn({
      //     name:'黑马李宗盛',
      //     age:32,
      //     sex:'男'
      // });

      /* (2) ES6 :函数传参  */

      // function fn1({name,age,sex}){
      //     //声明三个变量接收对象的参数值
      //     console.log(name,age,sex);
      // };

      // fn1({
      //     name:'黑马李宗盛',
      //     age:32,
      //     sex:'男'
      // });

      //添加解构语法默认值
      // function fn2({name = '班长',age = 38,sex:gender='女'}){
      //     //声明三个变量接收对象的参数值
      //     console.log(name,age,gender);
      // };

      // fn2({
      //     name:'黑马李宗盛',
      // });

      /* (3)函数默认参数 */

      /* ES5:使用逻辑或短路运算实现 */
      // function fn(n1,n2,n3){
      //     n1 = n1 || 10;
      //     n2 = n2 || 20;
      //     n3 = n3 || 30;
      //     console.log(n1,n2,n3);
      // };

      // fn(5,8);
      // fn();

      /* ES6:使用解构赋值语法默认值实现 */
      function fn (n1 = 10, n2 = 20, n3 = 30) {
        console.log(n1, n2, n3)
      }

      fn(5, 8)
      fn()
    </script>
  </body>
</html>

箭头函数

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /* 
    1.学习目标:学会使用ES6的箭头函数
        * 箭头函数 => 其实是 function 关键字的简写形式
        * 写法: 将function关键字使用 => 符号代替
    2.学习路线
        (1)介绍箭头函数的常见用法 : 重点
        (2)介绍箭头函数的其他用法 : 了解
    */

      //1.箭头函数常见用法

      //1.1 无参无返回函数

      /* ES5 */

      let fn = function () {
        console.log('111')
      }
      fn()

      /* ES6
        箭头函数规则: (1)function变成 箭头符号 =>   (2)形参小括号写到箭头 => 左边
        */

      let fn1 = () => {
        console.log('222')
      }
      fn1()

      //1.2 有参有返回函数

      /* ES5 */
      let add = function (a, b) {
        return a + b
      }

      console.log(add(10, 20))

      /* ES6 */
      let add1 = (a, b) => {
        return a + b
      }

      console.log(add1(100, 200))

      //2.箭头函数其他用法

      //2.1 如果函数只有一个形参,则可以省略形参小括号
      let fn2 = a => {
        return a * 2
      }

      console.log(fn2(20)) //40

      //2.2 如果函数体只有一行代码,则可以省略函数体大括号
      //注意点: 如果省略函数体大括号,则返回值也要省略return
      //下面代码等价于:  let fn3 = function(a){ return a*2 }
      let fn3 = a => a * 2

      console.log(fn3(30)) //60
    </script>
  </body>
</html>

 箭头函数中this

1.箭头函数  中  没有this:这意味着capp()  apply()   bind()  无法修改箭头函数中的this指向

2.箭头函数中的this指向:访问上一个作用域的this指向

     说人话:函数再哪个作用域声明,this就是谁(本质是通过作用域链访问上一个作用域中的this)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>

        /*ES6箭头函数中的this
        (1)箭头函数中没有this : 这意味着 call() apply() bind() 无法修改箭头函数中的this
        (2)箭头函数中的this指向 :访问上一个作用域的this
            说人话:函数在哪个作用域声明,this就是谁 (本质是通过作用域链访问上一个作用域中的this)
        
        */

        //1.全局函数 : window
        let fn = () => {
            console.log(this);

        };

        fn();//window
        fn.call({ a: 11 });//window   箭头函数中的this无法修改,因为箭头函数没有this

        //2.对象方法: window  (因为对象无法开辟作用域,obj所在作用域还是window)
        let obj = {
            sayHi: () => {
                console.log('学习使我快乐');

                console.log(this);
            }
        };
        obj.sayHi();//window

        //3.局部函数

        let person = {
            play: function () {
                console.log('play中的this');
                console.log(this);//person
                
                //在局部作用域声明一个箭头函数
                let fn2 = () => {
                    console.log('fn2在一级链中被声明,我的this就是一级链中的this');
                    console.log(this);//person
                };
                fn2();
            }
        };
        person.play();
    </script>
</body>

</html>

展开运算符

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        /* 
        1.展开运算符 :  ...
        2.作用: 相当于遍历对象简写
        3.应用场景:
            3.1 连接数组(上拉加载下一页) :  arr1.push(...arr2)
            3.2 求数组最大值  :  Math.max(...arr)
        */    

        //1.用于连接数组 : 页面上拉加载下一页的时候,就需要连接数组
        let arr1 = [10,20,30,40]
        let arr2 = [50,60,70,80]

        //ES5 : arr1.push.apply(arr1,arr2)
        // arr1.push(arr2[0],arr2[1],arr2[2],arr2[3])
        // arr1.push.apply(arr1,arr2)

        //ES6 : arr1.push(...arr2)
        arr1.push(...arr2)
        console.log(arr1)
        
        //2.用于求数组最大值
        let arr = [20,0,60,88,100,50]

        //ES5 : Math.max.apply(Math,arr)
        let max1 =  Math.max.apply(Math,arr)
        console.log( max1 )

        //ES6 : Math.max(...arr)
        let max2 =  Math.max(...arr)
        console.log( max2 )
        
    </script>
</body>
</html>

数据类型Set

 1.数据类型Set (集合) : 类似于数组,与数组唯一的区别是 : 不能存储重复元素

        2.应用 : 数组去重

            一行代码去重: let newArr =  Array.from( new Set(数组) )

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        /* 
        1.数据类型Set (集合) : 类似于数组,与数组唯一的区别是 : 不能存储重复元素
        2.应用 : 数组去重
            一行代码去重: let newArr =  Array.from( new Set(数组) )
        */    

        let arr = [10,20,60,80,20,60,99,10,100]//[10,20,60,80,99,100]

        //1.声明Set
        // let set =  new Set(arr)
        // console.log( set )
        //2.把set转成真数组
        // let newArr = Array.from(set)
        // console.log(newArr)

        /* 一行代码实现数组去重 */
        let newArr =  Array.from(new Set(arr))
        console.log(newArr)
        
    </script>
</body>
</html>

数组迭代方法

数组几种遍历介绍(共同点:回调函数一样)应用场景回调执行次数函数返回值回调是否需要return
map遍历映射数组== 原数组长度新数组(==)一定要return(当前元素)
filter遍历过滤数组== 原数组长度新数组(!=)return true(元素添加到新数组)
forEach遍历遍历数组== 原数组长度
some遍历找出符合条件的数!= 原数组长度布尔类型return true;循环结束
every遍历判断所有元素是否符合条件!= 原数组长度布尔类型return true; 循环继续
findIndex遍历获取符合条件的第一个元素位置(下标)!= 原数组长度数字return true; 循环结束
includes方法(底层是遍历)判断数组/字符串是否包含某一个值无回调布尔类型无回调

数组map遍历

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        
        /* 
        1. map场景 : 映射数组。 对数组每一个元素进行映射处理,得到一个全新数组
            映射关系: 每一个元素 * 0.8
            映射关系: 每一个元素 * 2

        2. map方法特点
            (1)回调执行次数  ===  数组长度
            (2)本身返回值 : 隐射之后的新数组
            (3)回调函数内部return
                return 新数组元素值
                如果不写return, 新数组每一个元素都变成undefined
        */

        let arr = [88,100,90,66,50]
        //全场8折
        let newArr = arr.map( (value,index)=>{
            console.log(index,value)//下标 元素
            return value*2
        } )

        console.log( newArr )
        
        
        
        
          
    </script>
</body>
</html>

数组filter遍历

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>

        /* 
        1. filter场景 : 筛选数组
            举例:找出数组中符合条件的元素
                找出数组中所有的偶数
                找出对象数组中符合条件的元素


        2. filter方法特点
            (1)回调执行次数  ===   数组长度
            (2)本身返回值 : 筛选之后的新数组
            (3)回调函数内部return
                return true : 满足筛选条件,当前元素放入新数组中
                return false : 不满足筛选条件,当前元素不放入新数组
        */


        let arr = [10, 55, 60, 88, 99, 70]

        //找出数组中所有的偶数
        let res = arr.filter((value, index) => {
            if (value % 2 == 0) {
                return true
            } else {
                return false
            }
        })

        // let res = arr.filter(v=>v % 2 == 0)

        console.log( res )


        //需求:筛选4000-5000之间
        let arr1 = [
            {
                name:'苹果电脑',
                price:8888
            },
            {
                name:'macbook',
                price:5888
            },{
                name:'xiaomi',
                price:3888
            },{
                name:'华为',
                price:4888
            },
        ]

        let res1 = arr1.filter( (value,index)=>{
            if( value.price > 4000 && value.price < 5000 ){
                return true
            }else{
                return false
            }
        } )

        // let res1 = arr1.filter( v=>v.price > 4000 && v.price < 5000 )
        console.log( res1 )
        
        


    </script>
</body>

</html>

数组some遍历

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        
        /* 
        1. forEach场景 : 遍历数组

        2. forEach方法特点
            (1)遍历次数  ===   数组长度
            (2)本身返回值
                无
            (3)回调函数内部return
                无
        */

        let arr = [10, 55, 60, 88, 99, 70]
        
        arr.forEach((value,index)=>{
            console.log(index,value)    
        })
          
    </script>
</body>
</html>

数组every遍历

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        
        /* 
        1. every场景 : 判断数组中是否所有元素都满足条件
            经典场景:开关法

        2. every方法特点
            (1)遍历次数  !=  数组长度
            (2)本身返回值
                true : 全部满足条件
                false: 有元素不满足条件
            (3)回调函数内部return
                true:循环继续。如果全部遍历结束还是true,则every方法默认返回就是true
                false:循环结束。并且every方法本身返回值是false
        */

        let arr = [10, 55, 60, 88, 99, 70]

        //判断数组中是否所有元素都是正数
        let res = arr.every((value,index)=>{
            if( value >= 0){
                return true
            }else{
                return false
            }
        })

        console.log( res )
        
        
          
    </script>
</body>
</html>

数组findindex方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        
        /* 
        1. findIndex场景 : 获取某个元素下标
            * 应用场景: 与 indexOf() 类似 . 但是findIndex一般用于对象数组
            

        2. findIndex方法特点
            (1)遍历次数  !=  数组长度
            (2)本身返回值
                有元素: 元素下标
                没有元素: 固定值-1
            (3)回调函数内部return
                return true: 找到了,循环立即结束。并且findIndex方法本身返回当前index
                return false: 没找到,循环继续。如果全部遍历完还是没找到,则得到默认返回值-1
        */

        let arr = [
            {
                name:'张三',
                age:20
            },
            {
                name:'李四',
                age:50
            },
            {
                name:'王五',
                age:20
            }
        ]

        let res =  arr.findIndex((value,index)=>{
            if( value.name == '李四'){
                return true
            }else{
                return false
            }
        })
        console.log( res )
        

        
        
        
          
    </script>
</body>
</html>

数组reduce方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    
    <script>
        /* 
        1.数组reduce方法 : 给每一个元素执行一次回调
        2.应用场景: 数组求和、求数组最大值
        3.语法:
            let res = arr.reduce((sum,value,index)=>{ return sum+value },0)
                * res返回值是最后一次sum的结果
        4.注意点: 一定要给初始值,否则reduce遇到空数组就会报错
        */    

        let arr = [10, 55, 60, 88, 99, 70]

        let sum = 0
        for(let i = 0;i<arr.length;i++){
            if(arr[i]>sum){
                sum = arr[i]
            }
        }
        console.log( sum )
        
        /**
        * @description:
        * @param {callbackFn}回调函数
            * (sum,value,index)=>{  sum:上一次的返回值 value:当前元素值  index:当前下标 } 
            * sum初始值 : 一般给0,否则空数组reduce报错   
        * @return: 最后一次回调的结果
        */
        let res = arr.reduce((sum,value,index)=>{
            console.log( sum,value,index )
            return sum+value
        },0)
        console.log( res )


        //求最大值
        let res1 = arr.reduce((sum,value)=>{
            if(sum>value){
                return sum
            }else{
                return value
            }
        },0)
        console.log( res1 )
        
        
    </script>
</body>
</html>