day08 - JavaScript函数的封装基础知识+函数的回调+数组的迭代方法

知识点回顾:

首先,让我们来回顾一下之前关于函数的知识吧~
1.函数的性质:封装性,复用性,调用性
2.函数名命名 :小驼峰(首字母不要大写)
3.形参:是指函数声明是的参数;用于接受实参的;本质上是局部变量
4.实参:函数调用时的参数;
5.返回值 return 作用 :返回一个结果;结束整个函数
6.函数的预编译:函数可以先调用后声明
7.arguments 用于接受实参列表(伪数组)
8. 递归函数:自己调用自己
9. 构造函数 :创建对象

数组:

1.数组的2种创建方式
  • [ ]
  • new Array(1,2,3,3)
2.封装:在JavaScript中,以下函数都封装好了,可以直接调用。但是我们仍然需要掌握这些函数封装的原理。
includes():

判断数组中是否存在某个值(假设法,假设存在)
includes的原生封装。

        //includes() :判断数组中是否存在某个值
        function includes(arr , a){
            //循环遍历数组
            for(var i = 0 ; i < arr.length ; i++){
                //如果存在,结束整个函数,返回true
                if(arr[i] == a){
                    return true ;
                }
            }
            return false ;
        }

        var res = includes([1,2,3,4,5]  , 4) ;
        console.log(res) ;

includes()用法:

var arr = [1,2,3,4,2,5] ;
        console.log(arr.includes(20));   //false
        console.log(arr.includes(1));    //true
indexOf():

判断数组中是否存在某个值,存在返回第一次出现的下标,不存在就返回-1
indexOf()的原生封装。

        function indexOf(arr,n){
            //循环整个数组
            for(var i = 0 ; i < arr.length ; i++){
                if(arr[i] == n) {
                    return i ;
                }
            }
            return -1 ;
        }

        var res = indexOf([1,2,3,4,5]  , 4) ;
        console.log(res) ;   // 3

indexOf()用法:第一次出现的下标,找不到就返回-1

var arr = [1,2,3,4,2,5] ;
        console.log(arr.indexOf(2));  // 1
        console.log(arr.indexOf(8));  // -1
lastIndexOf():

判断数组中是否存在某个值,存在返回最后一次出现的下标,不存在返回 -1

        function lastIndexOf(arr , n){
            for(var i = arr.length - 1 ; i >= 0 ; i--){
                if(arr[i] == n){
                    return i ;
                }
            } 
            return -1 ;
        }

        var res = lastIndexOf([1,2,3,4,5,2]  , 2) ;
        console.log(res) ;   // 5

lastIndexOf()用法:

var arr = [1,2,3,4,2,5] ;
        console.log(arr.lastIndexOf(2));  // 4
        console.log(arr.lastIndexOf(8));  // -1
join():

把数组变成字符串
1.有关join()的封装

        function join(arr){
            res = '' ;
            for(var i = 0 ; i < arr.length ; i++){
                i < arr.length - 1 ? res += arr[i] + ',' : res += arr[i] ;
            }
            return res ;
        }

        var res = join([1,2,3,4]) ;
        console.log(res) ;  // 1, 2, 3, 4 

2.join()的用法

var arr = [1,2,3,4] ;
console.log(arr.join('&')) ;  //1&2&3&4
console.log(arr.join('')) ;  //1234
push():

通过遍历可以向数组尾部追加无数个数

var arr = [1, 2, 3];
        console.log(arr.push('hello')); 

arguments:把数组的长度变长 arr[arr.length] = arguments[i]
pop():删除数组中最后一个值 ,创建一个新的数组 .遍历原数组时丢掉最后一个 i < arr.length - 1

concat():

拼接数组,返回一个新的数组
concat()的原生封装:

function concat(){
            var newArr = [] ;
            for(var i in arguments){
                var arr = arguments[i] ;
                for(var j in arr){
                    newArr.push(arr[j]) ;
                }
            }
            return newArr ;
        }

        var res = concat([1,2,3] , ['a','b','c']) ;
        console.log(res) ;

concat()的用法

var arr1 = [1,2,3,4] ;
var arr2 = [6,7,8] ;
var arr3 = arr1.concat(arr2) ;
console.log(arr3) ;
slice(i,i):

截取数组中的部分值,返回一个新的数组,截取数组中的值 (包前不包后)

var arr = [1,2,3,4,5,6,7] ;
        var arr1 = arr.slice(2 , 3) ;
        console.log(arr1) ;   //3
splice

splice(i , 删除的个数 , 新增的值…) 新增,删除,替换 — 直接改变原数组

用法1:在任意位置插入数据

        arr.splice(i , 0 , v1 ,v2 , v3 ....)

用法2:删除

        arr.splice(i , 删除的个数)

用法3:替换

        var arr = [1,2,3,4,5,6] ;
        //插入数据
        arr.splice(2 , 0 ,'a' , 'b') ;
        console.log(arr) ;  //[1, 'b', 3, 4, 5, 6]

        //删除
        arr.splice(1 , 2) ;
        console.log(arr) ;  //[1, 'b', 3, 4, 5, 6]

        //替换
        arr.splice(1 , 1 ,'hello') ;
        console.log(arr) ;  //[1, 'hello', 3, 4, 5, 6]

判断数组

  • 基本数据类型:number string boolean null undefined
  • 基本数据类型可以通过 typeof 来判断
  • 引用数据类型:function 数组 对象
  • 用 Array.isArray() 判断是不是数组
var arr = [1, 2, 3] ;
console.log(typeof arr) ;   //object 不能判断
console.log(Array.isArray(arr)) ;  //true  证明是数组

数组去重

数组去重的两种方法:
1.得到新的数组

        var arr = [1,2,3,42,1,3,2,2,1,3,5] ;
        var newArr = [] ;
        // 遍历原数组
        for(var i in arr) {
            // 判断原数组中每一个值是否在新数组中存在
            // if(newArr.indexOf(arr[i]) === -1)
            // if(!newArr.includes(arr[i])) {
            //     newArr.push(arr[i])
            // }

            // 自己把includes方法写了一遍
            var flag = false ;  
            for(var j in newArr) {
                if(newArr[j] === arr[i]) {
                    flag = true ;
                    break ;
                }
            }
            if(!flag) {
                newArr.push(arr[i])   
            }

        }

        console.log(newArr);  //[1, 2, 3, 42, 5]

2.直接改变原数组。原理是出现重复的就删掉

        //   拿第一个值出来跟后面所有的值作比较
        var arr = [1,2,3,42,1,3,2,2,1,3,5] ;
        
        // 比较的轮数
        for(var i = 0 ; i < arr.length - 1 ; i++) {
            // 拿第i个数与后面所有的数进行比较
            for(var j = i + 1 ; j < arr.length ; j++) {
                // 只要相同就删除
                if(arr[i] === arr[j]) {
                    // 没删除一个的时候,数组塌陷!!!!!!!!!!
                    arr.splice(j , 1);
                    j--;
                }
            }
        }

        console.log(arr);  //[1, 2, 3, 42, 5]

统计数组中每一个值出现的次数

方法一:统计每一个值出现的次数

        function sta(arr){
            //比较的轮数
            for(var i = 0 ; i < arr.length ; i++){
                var count = 0 ;
                //拿每一个值与所有的值比较
                for(var j = 0 ; j < arr.length ; j++){
                    if(arr[i] === arr[j]){
                        count++ ;
                    }
                }
                console.log(arr[i] + '出现了' + count + '次');
            }
            return count ;
        }
        sta([1,2,3,42,1,3,2,2,1,3,5]) ;

方法二:先去除重复再统计

// 方法1:先去重再统计
        var arr = [1,2,3,42,1,3,2,2,1,3,5] ;
        var arr2 = [] ;
        for(var i = 0 ; i < arr.length ; i++) {
            if(!arr2.includes(arr[i])) {
                arr2.push(arr[i])
            }
        } 
        console.log(arr2);


        // 拿新数组中的每一个值与原数组进行比较
        for(var i = 0 ; i < arr2.length ; i++) {
            var count = 0 ; 
            for(var j = 0 ; j < arr.length ; j++) {
                if(arr2[i] === arr[j]) {
                    count++
                }
            }
            console.log(arr2[i] + '出现了' + count + '次');
        }

方法三:一边删除一边统计

        for(var i = 0 ; i < arr.length ; i++) {
            // 拿第一个值与后面的值进行比较
            var count = 1 ;
            for(var j = i + 1 ; j < arr.length ; j++) {
                if(arr[i] === arr[j]) {
                    count++ ;
                    arr.splice(j , 1) ;
                    j-- ;
                }
            }
            console.log(arr[i] + '出现了' + count + '次');
        }
        console.log(arr);

方法四:先排序,再统计

//假设数组已经排好序了
var arr = [1,1,1,1,2,2,2,3,4,4];
        
        for(var i = 0 ; i < arr.length ;  ) {
            var count = 1 ;
            for(var j = i + 1 ; j < arr.length ; j++) {
                if(arr[i] === arr[j]) {
                    count++ ;
                }
                else {
                    // 只要不相等说明后面没有相同 的了
                    break ;
                }
            }
            console.log(arr[i] + '出现了' + count + '次');
            i += count
        }

sort 排序

sort() 方法用于对数组的元素进行排序,并返回数组。默认排序顺序是根据字符串ASCII码 ----- 升序

        var arr = [3,5,2,6,1];
        var res = arr.sort() ;
        console.log(res);   //[1, 2, 3, 5, 6]

使用 sort() 方法时,应该注意下面几个问题。

  1. 所谓的字母顺序,实际上是根据字母在字符编码表中的顺序进行排列的,每个字符在字符表中都有一个唯一的编号。

  2. 如果元素不是字符串,则 sort() 方法试图把数组元素都转换成字符串,以便进行比较。

  3. sort() 方法将根据元素值进行逐位比较,而不是根据字符串的个数进行排序。

var arr = [3,5,21,6,1];
        var res = arr.sort() ;
        console.log(res);   //[1, 21, 3, 5, 6]

注意:sort() 方法是在原数组基础上进行排序操作的,不会创建新的数组。

*如果想按照其他规则进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

  • 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
  • 若 a 等于b,则返回 0。
  • 若 a 大于 b,则返回一个大于 0 的值。

也就是说:比较函数两个参数a和b,返回a-b 升序,返回b-a 降序

sort(function(a,b){return a - b}) 升序
sort(function(a,b){return b - a}) 降序

var arr = [3,5,21,6,1];
        
        var res = arr.sort(function (a , b) { 
            //降序排列 
            return a - b
        })

        console.log(res);  //[1, 3, 5, 6, 21]

callback:回调函数

含义:被当作参数使用的函数叫回调函数

        function xunHuan(n , fn){
            for(var i = 0 ; i < n ; i++){
                fn()
            }
        }

        xunHuan(5 , function(){
            document.write(1 + '<br>') ;
        })

输出结果:
在这里插入图片描述

数组的迭代方法:

1.sort() ASCII升序(上文已经讲解,不再过多赘述,举个简单的例子吧~

        var arr = [5,3,22,1,7] ; 
        var res = arr.sort(function (a , b){
            //降序排列
            return b - a ;
        })
        console.log(res) ;   //[22, 7, 5, 3, 1]

2.forEach(function(v , i , arr){}) :遍历数组,其中 v 表示值,i 表示角标 ,arr表述数组。
3.map(function(v,i,arr){}) :改变数组中的值,返回一个新的数组 必须return
4.filter(function(v,i,arr){}) : 过滤器,找到满足条件的值,返回一个新的数组
5.every(function(v,i){}) :判断数组中是不是每一个值都满足条件
6.some(function(v,i){}) :判断数组中有没有满足条件的值

训练:利用遍历数组的方法求和

        var arr = [1,2,3,4,5,6,7] ;
        var sum = 0 ;
        //遍历数组
        arr.forEach(function (v , i , arr){
            //累加求和
            sum += v ;
        })
        console.log(sum) ;  //8
function forEach(arr , cb){
            for(var i = 0 ; i < arr.length ; i++){
                cb(arr[i] , i)
            }
        }

        forEach([1,2,3] , function(v , i){
            console.log(v) ;  // 1 2 3  值
            console.log(i) ;  // 0 1 2  角标
        })

训练:把数组中的每个值加1

var arr = [1 , 2 , 3] ;
        function countArr(arr , cb){
            for(var i = 0 ; i < arr.length ; i++){
                arr[i] += cb(arr[i])
            }
            console.log(arr) ;
        }

        countArr([2,3,4] , function(v){
            return v * 3 ;    
        })

最后:总结一个return的知识,return只对当前的 if 和函数管用。对上一层的循环是没用的。请看下面的例子
此时:return 不起作用,也没有任何意义。还是会输出数组的值

var arr = [5,3,22,1,7] ; 
        //遍历数组
        arr.forEach(function(v , i){
            //控制台打印数组的值
            console.log(v);   // 5 3 22 1 7
            if(i == 2){
                // break ;   // 报错
                return ;  //没有任何意义  还是会输出5 3 22 1 7
            }
        })
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值