第三周笔记整理

177 阅读8分钟

day11

一:正则表达式

含义:定义字符串中字符出现规则的表达式
何时:切割、替换、【验证】
如何:
   语法:/正则表达式/

1: 最简单的正则:

         关键字原文"no"  ——>/no/后缀;
         后缀:
             g:global   全部
             i:忽略大小写
   

2:备选字符集:

         /^[备选字符集]$/
       强调:a:一个中括号,只能管以为字符
            b:正则表达式默认只要满足就不管后续,我们希望从头到尾完全匹配
               解决:前^后加$  ——>只要是做验证就必须加
               
       特殊:
           如果备选字符集中的ascii码是连续的,那么可用——省略中间部分
              例如:
                  一位数字:[0-9]
                  一位字母:[A-Za-z]
                  一位字母、数字、下划线:[0-9A-Za-z_]
                  一位汉字:[\u4e00-\u9fa5]
    

3:预定义字符集:前辈们提前定义了一些字符集,方便我们简化备选字符集

   一位数字:\d===[0-9]
   一位数字、字母、下划线:\w===[0-9A-Za-z]
   一位空白字符:\s   包括:空格、换行、制表符
   

建议:优先使用预定义字符集,如果预定满足不了,自己再写备选字符集补充

问题:不管是预定义字符集还是备选字符集,一个都只能管一位

4:量词:规定一个字符集出现的次数

1):有明确数量:
  字符集{n,m}  前边相邻的字符集,至少n个,最多m个;
  字符集{n,}   前边相邻的字符集,至少n个,最多无限个
  字符集{n}    前边相邻的字符集,必须n个
  
2):没有明确的数量:
    ?  前边相邻的字符集,可有可无,最多1个
    *  前边相邻的字符集,可有可无,最多无限个
    +  前边相邻的字符集,至少一个,最多无限个

5:选择和分组

 选择:在多个规则中选一个
       规则1|规则2
 分组:将多个子规则临时组成了一组规则
       (规则1|规则2)
       

6:指定匹配位置

^   开头
$   结尾

特殊:
两者同时使用,前加^后加$,表示从头到尾要求完全匹配,只要做验证就必须这么写

7:密码强度验证

  4位密码,数字和字母的组合,至少出现一位数字和大小写字母
  
  如下:
      /^[0-9A-Za-z]{4}$/
  预判如下:
      /^(?![0-9]+$)规则$/   不能全由数字组成
      /^(?![a-z]+$)规则$/    不能全由小写字母组成
      /^(?![0-9a-z]+$)[0-9A-Za-z]{4}$/   不能全由数字组成,也不能全由小写字母组成,也不能由数字和小写字母组成,至少要有一个大写字母
      
      //4位密码数字和字母的组合,至少出现一位数字和大写字母
      var reg=/^[0-9a-z]+$)(?![A-Za-z]+$)[0-9A-Za-z]{4}$/
      
      //4位密码,数字和字母的组合,至少出现一位数字和大写字母和小写字母
      var reg=/^(?![0-9a-z]+$)(?![A-Za-z]+$)(?![A-Z0-9]+$)[0-9A-Za-z]{4}$/
      

二:支持正则的字符串的API: 替换 切割

1)切割:var arr=str.split(reg);

2)替换:鄙视题中
 a:基本替换法:  缺陷:替换的东西都是固定的
    str=str.replace(/正则表达式/后缀,"新内容")
    //replace支持正则,并且搭配上后缀可以找到全部关键字进行替换
    
 b:高级替换法:
    str=str.replace(/正则表达式/后缀,fuction(a,b,c){
                  //a:第一个形参是正则匹配到的关键字
                  //b:正则匹配到的关键字下标
                  //c:原文本身
                  return a.length==2?"xx":"xxx";
                                               });
   
 c:格式化
     例:
        var str="500234199301096452";
        var reg=/(\d{6})(\d{4})(\d{2})(\d{2})(\d{4})/;
        str=str.replace(reg.function(a,b,c,d,e,f){
                         
              //在return时,正则出现多个分组,会得到更多的形参,由多少个分组,就会出现多少个形参
              //a: 第一个形参是正则匹配到的关键字
              //b: 第二个形参会得到第一个分组获取到的部分
              //c: 第三个形参会得到第二个分组获取到的部分
                  ......
              return b+"年"+c+"月"+d+"日"
                   19930109日
                                             };
                                             

总结:前加^后加$ ——>验证 加后缀g ——>替换

三:正则对象:

1:创建:

     直接量:var reg=/正则表达式/后缀;
     构造函数: var reg=new RegExp("正则表达","后缀");

2: API验证:

    var bool=reg.test(用户输入的内容);
    true:验证通过
    false:验证失败
    
    input 绑定一个获取焦点事件: onfocus  ——>显示文字
                 获取失去事件: onblur   ——>获取用户输入内容
                 然后和正则判断给出正确或错误的样式
    form绑定提交事件onsubmit:  阻止  return false;
                 

day12

一:Math对象:专门提供了数学计算的API

  强调:不需要创建直接使用
  Math.pi===3.1415926 不需要创建,Math带有此属性

API:

1:取整方式:

a: 上取整:超过一点,取下个正数
   Math.ceil(num);
     Math.ceil(3.14);  ——>4
b:下取整:无论超过多少,省略小数点部分
   Math.floor(num);
     Math.floor(3.1415);  ——>3
c:四舍五入:
   Math.round(num);
 
 以上很少用到
 取整方式:以上三种+parseInt+num.toFixed(d);
 
 推荐:
    num.toFixed(d);  //d:表示保留几位小数,当d=0时,就是取整数。可用作四舍五入,保留指定小数位数,结果位字符串,搭配pareseFloat()用。
    
 鄙视题:
     不能用toFixed情况下,自己封装一个函数,实现toFixed功能,需求四舍五入,并保留小数功能
     function round(num,d){
         num*=Math.pow(10,d);
         num=Math.round(num);
         num/=Math.pow(10,d);
           return num;
                      };
           return result=round(3.5,0);
           console.log(result);
           

2:乘方和开方:

 **乘方:Math.pow(底数,幂);     ——>代替连乘操作
   开方:Math.sqrt(num);       ——>只能开平方
   

3:最大值和最小值

 var 最大的/最小的=Math.max/min(a,b,c,d,....);
    问题:本身不支持数组参数
    解决:固定用法:
      var 最大/最小值=Math.max/min.apply(Math.arr);
      apply:  1): 借用    2):打散数组为单个元素
      

4:绝对值

 Math.abs(负数)  ——>负数较为正数
 

5:随机数:

 Math.random();在0-1之间取一个随机的小数
 可取到0,但不可能取到1,意味着取不到最大值
 公式:
    parseInt(Math.random()*(max-min+1)+min);
    

二:Date对象:日期对象

1:创建:4种

  1):创建一个当前日期:
       var now=new Date();
  2):创建一个自定义时间
       var 函数名=new Date("yyyy/mm/dd hh:mm:ss");
                           xxxx年xx月xx日xx时xx分xx秒
  3):创建自定义时间
       var 函数名=new Date(yyyy,mm-1,dd,hh,mm,ss);  ——>月份是从0开始,默认0-11月。
  4):复制一个日期
      原因:日期的所有API都是直接修改原日期对象,无法获取修改之前的日期,所以在执行API之前都要先复制,再操作复制后的日期
      如何:
         var end=new Date(starti);
      操作:
         a:两个日期可以相减,得到一个毫秒差,换算出自己想要的部分。——>不用,不好换算。
         
         b:API:
             分量:时间的单位
             年(FullYear)  月(Month)  日(Date)  星期(Day)  时(Hours)  分(Minutes)  秒(Seconds)
             每一个分量都有一对:getxxx
                               setxxx
              其中:getxxx   负责获取某一个分量的值
                   setxxx    负责设置某一个分量的值
                   
      特殊:
         a 取值:
             FullYear:当前年份的数字
             Month0-11
             Date1-31
             Day0-6
             Hours:0-23
             Minutes:0-59

2、Day星期:没有set方法

3、如果希望对某个分量进行加减

date.setxxx(date.getxxx+/-n);

4、格式化日期为字符串,本地格式:

date.toLocaleString();   本地日期格式,有兼容问题——>垃圾

day13

一Error对象:错误

1:浏览器自带4种错误类型,可以快速找到自己的错误

  语法错误:SyntaxError       多半时符号错误
  引用错误:ReferenceError    没有创建直接使用
  类型错误:TypeError         方法错用
  范围错误:RangeError        只有num.toFixed(d);会碰到,d的取值范围只能0-100之间
  

2:只要发生错误就会报错,导致后续代码终止

  解决:就算发生错误,我们不希望报错,而是给一个错误提示,让后续代码继续执行
  
     语法:
        try{
             只放入错误代码
                         }catch(err){
                                     发生错误才会执行
                                     console.log(err); //err错误提示,英文
                                     console.log("中文的错误提示");
                                                                };
     try..catch:  性能差,可用分支奇数代替
     
     开发经验:防止客户恶意输入(!isNaN、正则)
     

3:抛出自定义错误:

  throw new Error("自定义错误信息");  ——>报错就会卡住后续代码
  

二:Function对象:

1:创建:3种

 *a:声明方式:
        function 函数名(形参,....){
                                   函数体;
                                   return 返回值
                                                };  ——>会完整的声明提前
 b: 直接量:
       var 函数名=function(形参,...){
                                    函数体;
                                    return 返回值
                                                };  ——>只有函数名部分会提前,但是赋值留在原地的,通过这个方法我们看出来函数名其实就是一个变量名
 *c: 构造函数
      var 函数名=new Function("形参1","形参2",..."函数体;return 返回值");
      何时用:如果你的函数体不是一个固定的而是动态拼接的一个字符串
      例如:
          var arr=[12,5,25,432,355,7,54,4312,41];
          var user=prompt("请进行排序,如果输入a-b为升序排序,如果输入b-a为降序排列");
          var compare=new Function("a","b","return"+user);
              arr.sort(compare);

2:调用时:如果还有return,记得接住

      var result=函数名(实参,...);

3:考点:

   1):创建方式
   2):作用域:变量使用规则:优先局部,再则全局,全局没有就报错
   3):声明提前
   4):按值传递
   5):重载overload:
           相同函数名,根据传入实参不同,可以自动选择对应的函数进行执行
           为什么:
                减轻开发压力
           问题:JS不支持重载
           解决:在【函数中】有一个对象: arguments对象
           arguments: 只能在函数中使用,自动创建,是一个类数组对象(支持下标、length、遍历)
           作用:可以接住所有传入的实参
           

arguments:

    a:实现重载,通过在函数中内部判断arguments的不同,执行不同操作
    b:以后有没有形参都无所谓
    c:正式开发中,有可能将多个函数整合为一个函数
  
  6):匿名函数:没有名字的函数
     a:匿名函数自调:
         为什么:节约内存
             (function(){
                 可以代替全局代码写法,尽量不在外部写代码
                        })();
         以后写网页先写上:
             (function(){
                         })();
     
     b:匿名函数回调:将函数作为了一个实参,传递给其它函数用
     
        1):学习目的:明白哪些叫做回调函数,只要是匿名函数,没有自调,就是回调
        
            例:
              arr.sort(function(){ });
              str.replace(reg.function(){ });
              elem.onclick=function(){ };
              
        2):以后ES6用箭头函数,简化一切回调函数
        3):了解一下回调函数的原理