函数(封装、调用、回调)、map、filte、every和some、reduce、 方法使用(进阶)

 一、为什么要封装函数

  • 函数可以把某些代码逻辑”封装“起来,在需要的时候通过调用函数来使用这些逻辑。
  • 函数可以复用代码,让开发可以写更少的代码,翻遍后期维护代码。 

1.0 数组拼接

toUpperCase():用于把字符串转换成大写,往str变量的值来看,把每个单词首字母转换成了大写

split():方法用于把一个字符串分割成字符串数组。

slice(start, end): 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。

join():这个方法用于数组中的所有元素拼接在一起。

let str = "get-elements-query-selector-all"

let arr = str.split("-")

for (let i = 1; i < arr.length; i++) {
  arr[i] = arr[i][0].toUpperCase() + arr[i].slice(1)
}

str = arr.join("")

console.log(str) //getElementsQuerySelectorAll

 1.1

let str2 = 'get-elements-query-selector-all';

      let arr1 = str2.split('-');

      for(let i = 1; i < arr1.length; i++){
        arr1[i] = arr[i][0].toUpperCase()+arr[1].slice(1);

      }
      str2 = arr1.join('');

二、封装转驼峰逻辑 

toUpperCase:方法用于把字符串转换为大写。

<script>
    let str1 = fn("get-elements-by-class-name")
    let str2 = fn("get-elements-query-selector-all")
    let str3 = fn("get-girlfriend-my-amazing-lover")

    function fn(str) {
      let arr = str.split("-")
      for (let i = 1; i < arr.length; i++) {
        arr[i] = arr[i][0].toUpperCase() + arr[i].slice(1)
      }
      str = arr.join("")
      return str
    }

    console.log(str3)
    
</script>

三、封装函数 

   //编程数组
   //倒序数组 .reverse
   //在编程字符串
   let str1 = fn('我爱你');//你爱我
   let str2 = fn('ABC');//CBA
   let str3 = fn('猪马牛羊');//羊牛马猪

      function fn(str){

        return ste.split('').reverse().join();
        
    }

四、参数类型 

4.0

  function fn(x){
            console.log(x);
       }

    fn(10);
    fn(1+1);
    fn(100 && 200);
    fn(Math.random());//任意随机数

 4.1

    function fn(x){
        console.log(x);
    }

    fn('你好');//string
    fn(true);//boolean
    fn(null);//NULL
    fn([11,22,33]);//arr(数组)
    fn({name:'小崔'});//Object
    fn(function(){});//回调函数

五、回调函数 

5.0

    function fn(num, y){
        y(num);
    }
    fn(200,function(x){
        console.log(x);
    })

 5.1

 事件赋值的函数,一般叫事件句柄(事件回调函数)

  •          oBtn.onlick = function(){}
  •          函数 => 一套的逻辑的封装 => 每套逻辑都有若干步骤  => 一套动作的封装. => 一个函数代表一套动作
  •          例:我们吃饭把 => 吃饭就是一种函数封装 =》封装的吃饭的一套动作
<body>
    <!-- 封装一个函数,用于给任意元素添加任意事件,触发任意事件逻辑
     -->
       <div id='div'> 1111</div>
       <button>按钮</button>
</body>
<script>
        let oDiv = document.querySelectorAll('div')[0];
        let oBtn = document.querySelectorAll('button')[0];
     
        fn(oDiv,'onclick',function(){
            alert('谁点我了');

        });

        fn(oBtn, 'onmouseover', function(){//onmouseover 鼠标移入事件
            console.log('鼠标移入');
            console.log('干饭了');
        });

        function fn(el,event, callback){
            el[event] = callback
        }

    
     </script>

六、对象的中括号  

<script>
       const obj ={
           name:'赵五',
           age:'18'
       }

       let name = 'age';

        console.log(obj[age]);

        console.log(obj[name]);
    //    console.log(obj.name);



       function fn(obj,key){
            console.log(obj[key]);
       }

       fn(obj, 'name');
       fn(obj, 'age');
    </script>

七、数组遍历 

数组遍历 => 数组循环 => 不用for循环来遍历数组的方法。 

<script>

       let arr = ['我', '他', '你']
    //    如何用forEach改写for
    // 把循环体内的代码放到forEach的回调函数内。

    // arr.forEach(function (item, i, arr){
    //     console.log(item, i);
    // })
   

    arr.forEach((item, i , arr) =>{
        console.log(item, i);
        console.log(arr);
    })
    </script>

八、forEach处理DOM 

html 

    <ul>
        <li>111</li>
        <li>222</li>
        <li>333</li>
        <li>444</li>
        <li>555</li>
    </ul>

js 

   <script>
        
        let aLi = document.getElementsByTagName('li');

        // aLi.oforEach((item, i) =>{
        //     console.log('item');
        //     item.style.backgroundColor = 'red';
        // })

        Array.from(aLi).forEach((item, i) =>{
            item.style.backgroundColor = 'red';
        });
    </script>

九、forEach封装 

<body>
    <div id="wrap">111</div>
</body>

 for循环方式 

<script>

        let oDiv = document.getElementById('wrap');
        let arr = [11, 22, 33]
 
        for(let i = 0; i < arr.length; i++){
            console.log('arr[i]');
            document.body.innerText += arr[i];
        }
  </script>

for循环方式 

    for(let i = 0; i < arr.length; i++){
            alert(arr[i]);
            oDiv.innerHTML += arr[i];
        }

 forEach循环方式

     myForEach((item, i, arr) =>{
            console.log(arr[i]);
            document.body.innerText += arr[i];
        });

       
     myForEach((item, i, arr) =>{
            oDiv.innerHTML += arr[i];
            alert(arr[i]);

        });    
    function myForEach(fn){
            for(let i = 0; i < arr.length; i++){
                fn(arr[i], i, arr);
            }
        }

十、map 

  •  map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
  • map() 方法按照原始数组元素顺序依次处理元素。
    let arr = [11, 22, 33]

       arr.forEach((item, i, arr) =>{
           console.log(item);
           arr[i] += 1;
       })
     arr = arr.map((item, i, arr) =>{
            return item + 1;
        })
    let arr = [100, 200, 300];

     for(let i = 0; i < arr.length; i++){
         arr[i] = arr[i] = '';


     }

      arr = arr.map((item, i, arr) =>{
          arr[i] = arr[i] + '';
      })

    
arr = arr.map((item, i, arr) =>{
        return item + '';
    })

十一、map封装 

<script>
       let arr = [100, 200, 300];

       function myMap(fn){
           let newArr = [];

           for(let i = 0; i < arr.length; i++){
                newArr.push(fn(arr[i],i))
           }

           return newArr
       }

       arr = myMap ((item, i) =>{
           return item + ''
       })

    </script>

十二、filter 

filter()方法会创建一个新数组,原数组的每个元素传入回调函数中,回调函数中有return返回值,若返回值为true,这个元素保存到新数组中;若返回值为false,则该元素不保存到新数组中;原数组不发生改变。

    <script>
        let arr = [1, 2, 3, 4];

        let newArr = arr.filter((item, i, arr) =>{
            return item % 2 === 0
        });

    </script>

十三、every和some 

<script>
        let arr = [1, 3, 4, 5];

        //  如何判断arr中的所有元素都是奇数?

        // revery用来做判断
        // 返回布尔值
        

        let flag = arr.every((item, i) =>{
            return item % 2 !== 0;

        });

        if(flag){
        alert('全是计数')
        }
 </script>

        // 如何判断数组中是否有奇数=>some


        let flag = arr.some((item, i) =>{
            return item % 2 !== 0
        });

        if(flag){
             alert('有至少一个奇数');
        }

十四、reduce 

reduce => 把所有(部分)元素,经过某个逻辑处理后,返回一个结果 

reduce() 方法对数组中的每个元素执行一个由您提供的reduce函数(升序执行),将其结果汇总为单个返回值。reduce方法可做的事情特别多,就是循环遍历能做的,reduce都可以做,比如数组求和、数组求积、数组中元素出现的次数、数组去重等等。

参数:

prev 必需。累计器累计回调的返回值; 表示上一次调用回调时的返回值,或者初始值 init;
cur 必需。表示当前正在处理的数组元素;
index 可选。表示当前正在处理的数组元素的索引,若提供 init 值,则起始索引为- 0,否则起始索引为1;
arr 可选。表示原数组;
init 可选。表示初始值。

<script>
       
        let arr = ['1', '2', 3];

        // 默认的循环次数是length-1
        // 第一次循环
        // total默认是第一个元素
        // item默认是第二个元素(默认从第二个元素开始循环)
        // 非第一次循环
        // total的只是回调函数return的值
        // item就是当前元素
        // num的返回值就是最后一次循环total的值
       let num = arr.reduce((total, item, i) =>{

            // console.log('total',total);
            // console.log('item',item);
            // console.log('i',i);
            return total + item;
        })

   
    </script>

十五、reduce 

<script>
        let arr = [{num:10}, {num:20}, {num:30}]

        // let num = arr.reduce((total, item) =>{
        //     return total.num + item.num
        // });
       
        // 如果reduce有第二个参数,则total默认就等于这个参数.(total的默认值就不再是第一个元素)
        // 这是reduce的循环次数就是数组的元素个数
        let num = arr.reduce((total, item) =>{
            return total + item.num
        }, 0);
</script>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值