重点

150 阅读6分钟

遍历数组方法 (重点)

        // 举一反三
        // 将别人原有的东西(经验)(学会)
        // 然后在去用于自己的东西



        // 筛选数组

        // var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7]; //大于等于10 的元素选出来,放入新数组
        /*
        1. 声明一个新数组用与存放符条件的元素
        2.遍历旧数组,找出大于等于10的元素
        3.依次追加到新数组里
        */
        //    方法一
        var newArr = [];
        var j = 0;
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] >= 10) {
                newArr[j] = arr[i]
                // 新数组应该从0开始,依次递增
                j++;
            }
        }
        console.log(newArr);

        // 方法二

        // 数组的长度会自动检测数组的长度
        var newArr = [];
        // newArr.length =0
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] >= 10) {
                newArr[newArr.length] = arr[i]
                // 新数组应该从0开始,依次递增
            }
        }
        console.log(newArr);


        //arr 筛选 小于10的元素 并存储到新数组中
        // 方法一
        var newArr1 = [];
        var j = 0;
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] < 10) {
                newArr1[j] = arr[i];
                j++;
            }
        }
        console.log(newArr1);

        // //方法二
        var newArr1 = [];
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] < 10) {
                newArr1[newArr1.length] = arr[i];
            }
        }
        console.log(newArr1);


        // 数组案例
        //  案例一
        // 数组 var arr = [2,0,6,1,77,0,52,0,25,7];中的0 去掉  形成一个不为0 的数组
        // 方法一
        var arr = [2, 0, 6, 1, 77, 0, 52, 0, 25, 7]
        var arr1 = [];
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] !== 0) {
                arr1[arr1.length] = arr[i]
            }
        }
        console.log(arr1);

        // // 方法二
        var arr1 = [];
        var j = 0;
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] !== 0) {
                arr1[j] = arr[i];
                j++;
            }
        }
        console.log(arr1)


        // 翻转数组
        //  案例二
        // 将数组['red','green','blue','pink','purple']的内容反过来储存
        //  输出 ['purple','pink','blue','green','red']
        var arr = ['red', 'green', 'blue', 'pink', 'purple'];
        // /* 1.声明一个新数组
        //    2.将旧数组最后一个值(arr[arr.length-1])给新数组的第一值arr1[0]即arr1[arr1.length]
        // */
        var arr1 = [];
        for (var i = arr.length - 1; i >= 0; i--) {
            // 核心代码是 反向遍历
            arr1[arr1.length] = arr[i];
        }
        console.log(arr1);
  • reduce (累加器)
    1. 使用的时候和之前的语法有一点区别
    • 语法:数组.reduce(function(prev,,item,index,origin){}.init)
      • prev:表示初始值(需要传递init) 或者表示数组[0]的值(需要不传递init)
      • item:如果传递init,item的值为数组[0] 如果没有传递init,item的值为数组[1]
      • index/origin:forEach相同

注意:

  • init 为可选项
    1. 如果书写 如果书写了init,那么prev的第一次的值,就是出init传递的,然后 item 的值是从[0]开始的 2. 如果没有书写 init,那么 prev 的第一次的值,是数组[0]的值,然后item 的值使用[1]
  • 作用:累加(叠加)
  • 返回值:循环运行后的值
var arr = [1, 2, 3, 4, 5,];
        //         0  1  2  3  4
        var res = arr.reduce(function (prev, item, index, origin) {
            return prev + item // arr[index]
            /* 
            // 不传参数时
                  prev + item
                   [0] + [1] ==  1 + 2 == 3 
                    3  + [2] ==  3 + 3 == 6
                    6  + [3] ==  6 + 4 == 10
                    10 + [4] ==  10 + 5 ==15
            */

            /*
               传参时
                    prev + item
                     5  +  [0] === 5 + 1 ==6 
                     6  +  [1] === 6 + 2 ==8
                     8  +  [2] === 8 + 3 ==11 
            
            
            */
        }, 5);
        console.log(res);// init 初始的值 

严格模式

  • 其实就是因为JS初期的不严谨,后续特意推出了一个严谨的版本,我们叫做严格模式
  • 在JS中默认是关闭的,如果要打开,需要在JS开始的位置,书写一个字符串‘use strict
  1. 在严格模式中,变量必须定义
  2. 函数的形参名不能重复
for (var i = 0; i < 3; i++) {}

//=======================================
        function fn(a,a){
            console.log(a);
        }
        fn(10,20)

字符串方法

  1. substr
  • 语法:字符串.substr(开始索引,多少个)
  • 作川:截取指定范围的字符串
  • 返回值:截取到的字符串
// 1. substr
        var str = 'QF123';
        var res = str.substr(0, 3);//从[0]开始截取,截取3个
        console.log(res); // QF1  //字符串
  1. substring
  • 语法: 字符串.substring(开始索引,结束索引)
  • 参数特点: (1). 包前不包后 (2). 可以不传参结束索引 (3). 可以不传递开始索引,但是推荐写上
  • 作用: 截取指定字符串
  • 返回值: 截取到的字符串
//2.substring 
        var str = 'QF123';
        // var trt = str.substring(0, 3);
        // console.log(trt);
        // var trt1 = str.substring(1);
        var trt2 = str.substring();
        // console.log(trt1);//QF1 // 字符串
        // F123
        console.log(trt2);
        // QF123
  1. slice 语法: 字符串.slice(开始索引 结束索引) 参数特点:参考数组中的slice 作用: 截取字符串 返回值: 截取到的字符串
//3.slice
        var str = 'QF123';
        // var tet = str.slice(1, 3);
        // console.log(tet);//F1 // 字符串
        var tet1 = str.slice(1);
        console.log(tet1);//F123
        var tet2 = str.slice();
        console.log(tet2);//QF123
  1. concat
  • 语法: 字符串.concat(数据1,数据2...)
  • 用: 将括号里的数据 合并到字符串中
  • 返回值: 合并(拼接)后的字符串 // 4.concat
// 4.concat
        var str = 'QF123';
        var res = str.concat('?','name','=')
        console.log(res);//QF123?name=
  1. split
  • 语法:字符串.split(分隔符)
  • 作用:在当前字符串中,找到指定的分隔符,然后根据分隔符将当前字符串拆分开,以数组的形式保存
  • 返回值:拆分后的数组

注意:

  1. 字符串中,有对应的分隔符: 将字符串会根据分惭符分隔开
  2. 字符串中,没有对应的分隔符: 将字符串当成一个整体,放在数组中
  3. 如果传递的是空字符串:将字符串每一个字符串全都分阳开,放在数纽中
// 5.split
        var str1 = 'name=zhangsan&age=18&sex=nan';
        var res = str1.split('&');
        // 找到'&',并将以'&'分割线将字符串拆分开并且拆分的字符串以逗号隔开
        // 而且 加中括号  即 以数组的形式返回
        console.log(res);//['name=zhangsan', 'age=18', 'sex=nan']
  1. indexof
  • 语法: 字符串.indexof(数据1,开始下标)
  • 作用: 寻找数据在字符串中的位置
  • 返回值: 找到的时候返回数据在字符串的下标,找不到返回 -1
//  7.lastindexof
        var tet1 = str.lastIndexOf(1, 2);
        console.log(tet1);//2
  1. lastindexof (从右到左,从字符串最后一位项第一位查找)
  • 语法: 字符串.indexof(数据1,开始下标)
  • 作用: 寻找数据在字符串中的位置
  • 返回值: 找到的时候返回数据在字符串的下标,找不到返回 -1
  1. trim
  • 语法: 字符串.trim()
  • 作川: 去除字符串左看两边的所有空格
  • 返回值: 去掉空格后的字符巾
  1. trimStart()/trimLeft()
  • 语法: 字符串.trimStart()
  • 作用: 去除字符串左侧空格
  • 返回值: 去掉空格后的字符
  1. trimEnd()/trimRight()
  • 语法: 字符串.trimEnd()
  • 作用: 去除字符串左侧空格
  • 返回值: 去掉空格后的字符串
        var str = '  q    we ';
      console.log(str)//  q    we ;
        var tet2 = str.trim();
      console.log(tet2);//q    we;
  1. includes
  • 语法:字符串.includes(字符串片段);
  • 作川:判断 当前字符串中 是否拥有 这个字符串片段
  • 返回值:一个布尔值 1. true -> 拥有; 2. false -> 没有
        var str = 'asfdsvv'
        var tet = str.includes('asf');
        console.log(tet);// true
  1. startswith
  • 语法: 字符事.startswith(字符串片段)
  • 作用: 判断 当前字符串开头 是否拥有这个字符串片段
  • 返回值: 一个布尔值 1. true -> 拥有; 2. false -> 没有
        var tet1 = str.startsWith('asf');
        console.log(tet1);//true
  1. endsWith
  • 语法: 字符串.endsWith(字符串片段)
  • 作用: 判断 当前字符串结尾 是否拥有这个字符串片段
  • 返回值: 一个布尔值 1. true -> 拥有; 2. false -> 没有
        var tet2 = str.endsWith('svv');
        // 注意  endsWith 遵守驼峰命名法则 W为大写
        console.log(tet2);//true
  1. replace
  • 语法: 字符串.replace()
  • 语法: 字符串.repLace('要被替换的字符串','新的字符')
  • 作用: 在字符串中 先找到 要被替换的字符串,找到后将新的字符串 替换过去 首先找到第一次出现的
  • 返回值: 替换后的字符串
var trt = str.replace('fds','sads');
        console.log(trt);//assadsvv

案例(一)

// 小练习: 反转字符串
        var str = 'abcde';   // -> edcba
        var str1 =''; 
        // for (var i = str.length - 1; i >= 0; i--) {
        //     str1[str1.length] = str[i];
            // console.log(str);
            // 字符串的索引获取到的是只读属性, 也就是说, 能看, 但是不能修改   // ****非常重要  注意不能通过索引来改变字符串的项     *******
        // }
        // console.log(str1);

        /*
        1. 将字符串拆分成一个数组
        2. 数组的反转
        3. 将反转后的数组 合并 为一个字符串
        */ 
改进代码:
        var tet = str.split('');
        // 转化为数组
        var tet1 = tet.reverse();
        // 反转数组的项
        var tet2 = str.join('');



        // var arr = str.split('')
        // var newArr = arr.reverse()

        // 链式调用
        // 分割符为空格 而且转变成字符串
        var tet2 = str.split('').reverse().join('');
        console.log(tet2);

练手题

// 需求: 将数组内的重复项去除

方法一:

        var arr = [1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5];

        // 处理后的数组: [1, 2, 3, 4, 5]
        // 要求: 只能使用 splice 或者 indexOf 完成, 其他方式不行!


        // 1. 对比前后两项, 是否相同, 如果相同删除一项, 注意! 数组塌陷
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] === arr[i + 1]) {
                arr.splice(i, 1)
                i--;
            }
        }
        console.log(arr)

方法二:
// 2. 创建一个空数组, 遍历原本的数组, 然后去空数组中查找, 是否有原数组的这个数据, 如果没有插入到空数组中
        var newArr = [];
        for (var i = 0; i < arr.length; i++) {
            if (newArr.indexOf(arr[i]) === -1) {
                newArr.push(arr[i])
            }
        }
        console.log(newArr)

小案例(二)

替换违禁词(面视题)

方法一
        var str = 'XXX1234XXX5678XXX';
        var tet = str.replace('XXX', '***');
        var tet1 = tet.replace('XXX', '***');
        var tet2 = tet1.replace('XXX', '***');
        // 假设字符串中的XXX是一个违禁词,我们现在的求是将XXX替换为'***·
        
        for (var i = 0; i < str.length; i++) {
            str = str.replace('XXX','***');
        }
        console.log(str);
代码解析:
/*
        第一次循环
          str1 = 'XXX12YYY34XXX56YYY78XXX'; 有数组的项   即有'XXX','YYY'
             ==> str1 = '***12***34XXX56YYY78XXX';
        
        第二次循环     
        str1 = 'XXX12YYY34XXX56YYY78XXX';  有数组的项   即有'XXX','YYY'
             ==> str1 = '***12***34***56***78XXX'; 
        
        第三次循环
        str1 = 'XXX12YYY34XXX56YYY78XXX';  有数组的项   即有'XXX','YYY'
             ==> str1 = '***12***34***56***78***'; 
        */
方法三
var str1 = 'XXX12YYY34XXX56YYY78XXX';
        while (str1.includes('XXX', 'YYY')) {
            str1 = str1.replace('XXX', '***');
            str1 = str1.replace('YYY', '***');
        }
        console.log(str1);

        var arr = ['XXX', 'YYY',];
        // 定义 一个数组存一个我们要改的违禁词
        arr.forEach(function (item) {
            // console.log(item); //遍历数组的每一项  'XXX' 'YYY'
            while (str1.includes(item)) {
                // 判断是否有数组中的项  有 即true 则进行下面的代码
                str1 = str1.replace(item, '***');
                // 将数组中项全部替换为 ***
            }
        });
        console.log(str1);

转化进制数

十进制转换为其他进制

  • 十进制的数字.toString(你要转换的进制数);

其他进制转换成十进制

  • parseInt(数字,将数字视为x进制的数字然后转换成10进制)

保留小数(掌握)

保留小数的数字.toFixed(要保留几位小数) (采用四舍五入的方式,并且返回的是一个字符串)

        var num = 321;
        console.log(num.toString(2));//101000001
        console.log(parseInt(100, 2));// 4 
        // 把 100 作为2进制的数字(不用转为2进制的数字) 打印结果为10进制
        var num = 123.4568
        var num1 = 123.41694856
        var num2 = 123
        console.log(num.toFixed(2));//123.45

        console.log(num1.toFixed(3));//123.417
        // 最后结果要四舍五入
        console.log(num2.toFixed(3));//123.000

定时器与倒计时器

  • 语法:
// 定时器:
       setInterval(function () {
        // 定时器每次执行的时候,要执行的代码
        console.log('当前定时器,每1秒,执行1次')
         }, 500); //时间单位是毫秒  
   返回值:
         含义:   表明当前页面有多少个定时器或者倒计时器
         作用:   停止当前定时器或者倒计时器 
   关闭定时器的注意事项:
         关闭的时候, 有两个方法 clearTimeout/clearInterval; 可以混用 (但是不推荐混用)   
代码解析:
        // 关闭倒计时器
        // clearTimeout(id)
var id = setInterval(function () {
            console.log('你好')
        }, 2000)

        clearInterval(id)


//倒计时器  
         var id = setTimeout(function () {
            console.log('倒计时器执行')
        }, 3000)

同步与异步

     1. JS 中, 任务分为 同步任务和异步任务 
     2. 目前我们接触到定时器与倒计时器都属于异步任务, 其他代码都是同步代码
     3. JS 中执行任务, 会先将所有的同步任务执行完, 等所有同步任务执行完毕, 在开始执行异步任务
     代码演示
        // 1s == 1000ms
        //   通常用毫秒为单位
        console.log('开始'); // 同步

        setTimeout(function () {
            console.log('0','执行过程'); // 异步
        }, 3000,);
        console.log('结束');//同步