第六周第四天筆記

1. 驗證正則表達(dá)式中的全局g對幾種方法的影響

  • test校驗方法:正則的方法
    • 總結(jié):1)不添加全局g時,lastIndex值始終是0肛搬,所以每次檢驗匹配時没佑,都是從0開始查找,查找到就返回true,查找不到就返回false温赔;2)添加全局g后蛤奢,test方法會對lastIndex值進(jìn)行疊加改變,每檢驗一次陶贼,lastIndex值就改變一次啤贩,下次查找的時候從lastIndex值開始查找;
     <script>
         var str="yuanmeng00huadianyuanmenghuadian11";
         var reg=/yuanmeng\d+/;
         var reg1=/yuanmeng\d+/g;
         //不添加全局g;
         console.log(reg.test(str));//結(jié)果為true;
         //添加全局g;
         console.log(reg1.lastIndex);//結(jié)果為0拜秧;
         console.log(reg1.test(str));//結(jié)果為true;查找到的結(jié)果為yuanmeng00瓜晤;
         console.log(reg1.lastIndex);//結(jié)果為10;
         console.log(reg1.test(str));//結(jié)果為false腹纳,從索引為10的字符開始查找痢掠,查找不到,返回null;
     </script>
    
  • exec方法:正則的方法
    • 總結(jié):1)不添加全局g,每次查找的時候嘲恍,都是從0開始足画,reg的lastIndex一直是0;2)正則exec方法中添加g佃牛,那么淹辞,每使用一次就查找一個,然后以數(shù)組的形式輸出俘侠,每次查找輸出后象缀,下次查找的位置通過reg的lastIndex屬性值記錄住蔬将,再次使用exec方法查找時,就從上次結(jié)束的地方開始查找央星;
     <script>
        var str="yuanmenghuadianyuanmenghuadian11";
        var reg=/yuanmeng/;
        var reg1=/yuanmeng/g;
        //2.1 驗證不添加全局g
        console.log(reg.exec(str));//結(jié)果為:["yuanmeng", index: 0, input: "yuanmenghuadianyuanmenghuadian11", groups: undefined]
        console.log(reg.lastIndex);//結(jié)果為:0
        console.log(reg.exec(str));//結(jié)果為:["yuanmeng", index: 0, input: "yuanmenghuadianyuanmenghuadian11", groups: undefined]
        console.log(reg.lastIndex);//結(jié)果為:0
        console.log(reg.exec(str));//結(jié)果為:["yuanmeng", index: 0, input: "yuanmenghuadianyuanmenghuadian11", groups: undefined]
        console.log(reg.lastIndex);//結(jié)果為:0
        //總結(jié):不添加全局g,每次查找的時候霞怀,都是從0開始,reg的lastIndex一直是0莉给;
        //2.2 驗證添加全局g
        console.log(reg1.exec(str));//結(jié)果為:["yuanmeng", index: 0, input: "yuanmenghuadianyuanmenghuadian11", groups: undefined]
        console.log(reg1.lastIndex);//結(jié)果為:8
        console.log(reg1.exec(str));//結(jié)果為:["yuanmeng", index: 15, input: "yuanmenghuadianyuanmenghuadian11", groups: undefined]
        console.log(reg1.lastIndex);//結(jié)果為:23
        console.log(reg1.exec(str));//結(jié)果為:null
        console.log(reg1.lastIndex);//結(jié)果為:0
        console.log(reg1.exec(str));//結(jié)果為:["yuanmeng", index: 0, input: "yuanmenghuadianyuanmenghuadian11", groups: undefined]
        //總結(jié):正則exec方法中添加g毙石,那么,每使用一次就查找一個颓遏,然后以數(shù)組的形式輸出徐矩,每次查找輸出后,下次查找的位置通過reg的lastIndex屬性值記錄住叁幢,再次使用exec方法查找時滤灯,就從上次結(jié)束的地方開始查找; 
     </script>
    
  • match方法:字符串的方法
    • 總結(jié):字符串match方法曼玩,本質(zhì)就是查找內(nèi)容力喷,查找到一個就返回一個數(shù)組,數(shù)組中有三項演训;與exec方法獲取的相同弟孟;
    • 總結(jié):1)當(dāng)不添加全局g時;match方法相當(dāng)于exec方法样悟,查找到內(nèi)容拂募,以一個數(shù)組的方式返回,里面有三項窟她;2)當(dāng)添加全局g時陈症,match方法,就把所有滿足reg規(guī)則的內(nèi)容震糖,作為數(shù)組元素录肯,返回一個新的數(shù)組;
     <script>
         var str="yuanmenghuadianyuanmenghuadian11";
         var reg=/yuanmeng/;
         var reg1=/yuanmeng/g;
         console.log(str.match(reg));//結(jié)果為:["yuanmeng", index: 0, input: "yuanmenghuadianyuanmenghuadian11", groups: undefined]
         console.log(str.match(reg1));//結(jié)果為:["yuanmeng", "yuanmeng"]
         //總結(jié):當(dāng)不添加全局g時吊说;match方法相當(dāng)于exec方法论咏,查找到內(nèi)容,以一個數(shù)組的方式返回颁井,里面有三項厅贪;
         //當(dāng)添加全局g時,match方法雅宾,就把所有滿足reg規(guī)則的內(nèi)容养涮,作為數(shù)組元素,返回一個新的數(shù)組;
     </script>
    
  • replace方法:字符串的方法
    • 總結(jié):1)字符串replace方法在使用的時候贯吓,只要在字符串中只要找到一個被替換的內(nèi)容懈凹,就停止,然后替換掉悄谐,返回一個新的字符串介评;注意:只要找到一個就結(jié)束;2)當(dāng)正則的表達(dá)式不添加全局g時尊沸,此時就代表查找一次,當(dāng)使用的時候贤惯,只要找到一個洼专,也是停止,只不過是把替換的內(nèi)容孵构,換成了一個規(guī)則屁商,本質(zhì)沒有變化;3)當(dāng)正則表達(dá)式中添加了全局g后颈墅,意思是在全局中查找蜡镶,是查找所有滿足正則規(guī)則的內(nèi)容,然后進(jìn)行全部替換恤筛,返回新的字符串官还;
     <script>
         var str="yuanmenghuadianyuanmenghuadian11";
         var reg=/yuanmeng/;
         var reg1=/yuanmeng/g;
         console.log(str.replace(reg,"meihao"));//結(jié)果為:meihaohuadianyuanmenghuadian11
         console.log(str.replace(reg1,"meihao"));//結(jié)果為:meihaohuadianmeihaohuadian11
         //總結(jié),不添加全局g毒坛,那么在查找的時候望伦,找到一個就停止,然后替換掉煎殷,再結(jié)束屯伞,返回新的字符串;
         //添加全局g豪直,那么在查找的時候劣摇,查找到全部,然后全部替換弓乙,再結(jié)束末融,返回新的字符串;
     </script>
    

2. 字符串的repalce方法與正則配合后的變化

  • 總結(jié):
    • 字符串replace方法暇韧,本質(zhì)就是查找被替換的內(nèi)容滑潘,然后將其替換,返回一個新的字符串锨咙,但是需注意的一點(diǎn)是语卤,每次查找只查找一個,只要有一個就停止,然后替換一個粹舵,結(jié)束钮孵,不會同時替換兩個滿足要求的內(nèi)容;
    • 不添加全局g,跟上述方法結(jié)果一樣纽匙,仍然只是查找一個疼进,然后替換一個,結(jié)束漾唉;
    • 添加全局g,改變查找規(guī)則,在查找的時候堰塌,將滿足規(guī)則的內(nèi)容全部查找到赵刑,然后全部替換,最后結(jié)束场刑;
    • 正則改變的般此,只是一個規(guī)則,不會改變replace的特性牵现,只是改變了查找規(guī)則铐懊;
    • 實(shí)質(zhì):字符串原有的replace方法,特性沒有改變瞎疼,只不過是通過添加正則科乎,來改變了查找的規(guī)則;由原來的查找一個贼急,改為查找所有喜喂,而這個起決定性作用的就是正則,它制定的規(guī)則竿裂;
<script>
    //需求:利用字符串的replace方法玉吁,將str中的兩個huadian,全都替換成huandianxiehe;
    var str="huadianhuadian";
    str=str.replace("huadian","huadianxiehe");
    console.log(str);//結(jié)果為:huadianxiehe huadian;
    str=str.replace("huadian","huadianxiehe");
    console.log(str);//結(jié)果為:huadianxiehe xiehe huadian;
    //總結(jié):字符串replace方法腻异,本質(zhì)就是查找被替換的內(nèi)容进副,然后將其替換,返回一個新的字符串悔常,但是需注意的一點(diǎn)是影斑,每次查找只查找一個,只要有一個就停止机打,然后替換一個矫户,結(jié)束,不會同時替換兩個滿足要求的內(nèi)容残邀;
    //替換一次皆辽,然后再添加代碼柑蛇,去替換第二次的時候,是從第一個開始查找驱闷,如果中途查找到內(nèi)容耻台,就會停止,不會再繼續(xù)空另,導(dǎo)致的問題是盆耽,最后那個huadian永遠(yuǎn)不會被查找到;

    //正則中的replace方法扼菠;
    //1.正則表達(dá)式中不添加全局g摄杂;
    var str="huadianhuadian";
    var reg=/huadian/;
    str=str.replace(reg,"huadianxiehe");
    console.log(str);//結(jié)果為:huadianxiehe huadian
    str=str.replace(reg,"huadianxiehe");
    console.log(str);//結(jié)果為:huadianxiehe xiehe huadian
    //總結(jié):不添加全局g,跟上述方法結(jié)果一樣循榆,仍然指揮查找一個析恢,然后替換一個,結(jié)束冯痢;
    //2. 正則中添加全局g,
    var str="huadianhuadian";
    var reg=/huadian/g;
    console.log(str.replace(reg,"huadianxiehe"));//結(jié)果為:huadianxiehe huadianxiehe
    //總結(jié)氮昧,添加全局g,改變查找規(guī)則框杜,在查找的時候浦楣,將滿足規(guī)則的內(nèi)容全部查找到,然后全部替換咪辱,最后結(jié)束振劳;
    //大總結(jié):正則改變的,只是一個規(guī)則油狂,不會改變replace的特性历恐,只是改變了查找規(guī)則;
    //實(shí)質(zhì):字符串原有的replace方法专筷,特性沒有改變弱贼,只不過是通過添加正則,來改變了查找的規(guī)則磷蛹;由原來的查找一個吮旅,改為查找所有,而這個起決定性作用的就是正則味咳,它制定的規(guī)則庇勃;
</script>

3. replace方法中的回調(diào)函數(shù)

  • 回調(diào)函數(shù):把函數(shù)的定義階段作為參數(shù),賦給另外一個函數(shù)槽驶,這樣的函數(shù)就叫做回調(diào)函數(shù)责嚷;
  • replace方法中的回調(diào)函數(shù):
    • replace方法中的回調(diào)函數(shù)調(diào)用的次數(shù),取決于正則匹配的次數(shù)掂铐,匹配幾次罕拂,就調(diào)用幾次揍异;
    • replace方法,每查找到一次符合正則的內(nèi)容聂受,就調(diào)用一次函數(shù)蒿秦,同時傳入當(dāng)前獲取內(nèi)容的三項參數(shù),其實(shí)可看作對內(nèi)容的所有滿足情況的遍歷蛋济;
    • replace方法中的回調(diào)函數(shù)會傳入實(shí)參棍鳖,傳入的內(nèi)容為exec獲得的三項內(nèi)容值,如1)item:大正則內(nèi)容(如果有小分組碗旅,則第二項為小分組的內(nèi)容)渡处;2)index:每次查找到的內(nèi)容,開頭對應(yīng)的索引值祟辟;3)input:字符串医瘫;
     <script>
         //回調(diào)函數(shù):把函數(shù)的定義階段作為一個參數(shù)賦給另外一個函數(shù),這個函數(shù)就叫做回調(diào)函數(shù)旧困;
         var str="yuanmengyuanmeng";
         var reg=/yuanmeng/g;
         //replace中的回調(diào)函數(shù)調(diào)用的次數(shù)醇份,取決于正則匹配成功的次數(shù);
         //replace中的回調(diào)函數(shù)吼具,拿到的參數(shù)跟exec拿到的返回值是一樣的僚纷;
         str=str.replace(reg,function (item,index,input) {
             //檢驗回調(diào)函數(shù)中傳入了哪些實(shí)參,用arguments
             console.log(arguments);//結(jié)果為:["yuanmeng", 0, "yuanmengyuanmeng"]拗盒;
             return "yuanmengpeixun";
         });
         console.log(str);//結(jié)果為:yuanmengpeixunyuanmengpeixun
     </script>
    
  • 實(shí)例1:過濾敏感詞怖竭,即利用replace方法,將特定的詞替換成對應(yīng)數(shù)目的*號陡蝇;
    • 知識點(diǎn):replace方法中使用回調(diào)函數(shù)痊臭,獲取第一個大正則內(nèi)容參數(shù);
     <body>
     <textarea id="t1" cols="30" rows="10">
         天空藍(lán)和美麗的大地收到印度那地方黑發(fā)黑非法是否IE或打開IE減肥登夫,印度減肥而恢復(fù)餓得慌IE反對黨的鳳飛飛歡迎和熱愛广匙,祖國人民都非常愛戴天空藍(lán)和美麗的大地;
     </textarea>
     <input type="button" value="過濾敏感詞"/>
     <textarea id="t2" cols="30" rows="10"></textarea>
     <script>
         var oT1=document.getElementById("t1");
         var oT2=document.getElementById("t2");
         var oBtn=document.getElementsByTagName("input")[0];
         var reg=/(天空藍(lán)|美麗的大地|印度)/g;
         oBtn.onclick=function(){
             oT2.value=oT1.value.replace(reg,function (item) {
                 //此時獲得的第一個參數(shù)為大正則內(nèi)容恼策,如天空藍(lán)鸦致,美麗的大地,印度戏蔑,這些都是字符串蹋凝,遍歷字符串,來決定*的個數(shù)
                 var str="";
                 for(var i=0; i<item.length; i++){
                     str+="*";
                 }
                 return str;
             });
         };
     
     </script>
     </body>
    
  • 實(shí)例2:模板修改
    • 知識點(diǎn):replace方法中使用回調(diào)函數(shù)总棵,回調(diào)函數(shù)中傳入的第一項為大正則的內(nèi)容鳍寂,第二項為小分組的內(nèi)容;
     <script>
         var str="my name is {0},i come from {1},my age is {2}";
         var ary=["果木山","保定",26];
         var reg=/{(\d)}/g;
         var res=str.replace(reg,function ($1, $2) {
             //$1代表大正則的內(nèi)容情龄,$2代表小分組的內(nèi)容
             return ary[$2];
         });
         console.log(res);//結(jié)果為:"my name is 果木山,i come from 保定,my age is 26"
     </script>
    
  • 實(shí)例3:數(shù)字變漢字
     <script>
         //需求:將數(shù)字變?yōu)闈h字迄汛;
         var str="我以后的目標(biāo)是工資達(dá)到15555元";
         var ary=["零","壹","貳","叁","肆","伍","陸","柒","捌","玖"];
         var res=str.replace(/\d/g,function ($1) {
             return ary[$1];
         });
         console.log(res);//結(jié)果為:我以后的目標(biāo)是工資達(dá)到壹伍伍伍伍元
     </script>
    
  • 實(shí)例4:去除字符串中的空格
     <script>
         var str="   meihoa   miehfaofie    ";
         //需求1:只去除開頭和結(jié)尾的空格
         var reg=/(^\s+)|(\s+$)/g;
         var res=str.replace(reg,"");
         console.log("("+res+")");//結(jié)果為:(meihoa   miehfaofie)
         //需求2:去除所有的空格
         var reg2=/\s+/g;
         var res2=str.replace(reg2,"");
         console.log("("+res2+")")//結(jié)果為:(meihoamiehfaofie)
     </script>
    
  • 實(shí)例5:利用對象不重名的特性來統(tǒng)計字母的重復(fù)次數(shù)
    • 思路:
      1. 利用對象的不重名特性捍壤,統(tǒng)計單詞,以及出現(xiàn)的次數(shù)
      2. 找到出現(xiàn)最多的次數(shù)鞍爱;假設(shè)法
      3. 通過次數(shù)找字母
     <script>
         //需求:求出現(xiàn)次數(shù)最多的單詞(不分大小寫)鹃觉,以及出現(xiàn)了多少次;
         //第一步:利用對象的不重名特性睹逃,統(tǒng)計單詞盗扇,以及出現(xiàn)的次數(shù)
         var str="aaaabbdddDJJJLLLIIEEaaBBDbbcccCCC";
         var obj={};
         for(var i=0; i<str.length; i++){
             var cur=str[i].toLowerCase();
             if(obj[cur]){
                 obj[cur]++;
             }else{
                 obj[cur]=1;
             }
         }
         //第二步:找到出現(xiàn)最多的次數(shù);
         //假設(shè)法:假設(shè)a的次數(shù)最多
         var max=obj.a;
         for(var attr in obj){
             if(obj[attr]>max){
                 max=obj[attr];
             }
         }
         //第三步沉填,通過次數(shù)找單詞
         var ary=[];
         for(var atr in obj){
             if(obj[atr]==max){
                 ary.push(atr);
             }
         }
         var str=ary.join("疗隶、");
         console.log("出現(xiàn)最多次數(shù)的單詞是:"+str);//結(jié)果為:出現(xiàn)最多次數(shù)的單詞是:a、b翼闹、c
         console.log("出現(xiàn)的最多的次數(shù)是"+max+"次");//結(jié)果為:出現(xiàn)的最多的次數(shù)是6次
     </script>
    

4. replace方法與exec方法及match方法之間的聯(lián)系

  • exec方法:目的是捕獲滿足reg規(guī)則的內(nèi)容斑鼻,返回一個數(shù)組,數(shù)組中有三項猎荠;每次只能拿到一個滿足規(guī)則的內(nèi)容坚弱;
  • match方法:目的是查找所有滿足reg規(guī)則的內(nèi)容,然后組成一個新的數(shù)組关摇,返回荒叶;可以拿到全部滿足規(guī)則的內(nèi)容;
  • replace方法:目的也是查找所有滿足reg規(guī)則的內(nèi)容拒垃,進(jìn)行替換停撞;但是當(dāng)存在回調(diào)函數(shù)時瓷蛙;其目的跟match方法很像悼瓮;每查找到一次,回調(diào)函數(shù)就執(zhí)行一次艰猬,就傳入一次參數(shù)横堡,參數(shù)值與exec獲得的值相同,意思就是對exec進(jìn)行了多次使用冠桃,直到查找完命贴;同時在回調(diào)函數(shù)中獲取的第一項,就是每次查找到的內(nèi)容食听,每調(diào)用一次回調(diào)函數(shù)胸蛛,就是獲取match方法獲得的數(shù)組中的每一項,也就是對match方法獲取數(shù)組進(jìn)行一次遍歷樱报;

5.RegExp類實(shí)例私有屬性lastIndex

  • lastIndex屬性:正則RegExp類實(shí)例的私有屬性葬项;
    • 正則表達(dá)式中,若不添加全局g迹蛤,則lastIndex值始終為0民珍,test方法和exec方法不會改變它襟士,每次查找都從0開始查找;
    • 正則表達(dá)式中嚷量,若添加全局g陋桂;則test方法和exec方法,都會對lastIndex值產(chǎn)生影響蝶溶,lastIndex值記錄本次查找到內(nèi)容后嗜历,內(nèi)容結(jié)尾的下一項的索引值,下次再查找時抖所,會繼續(xù)從lastIndex值開始查找秸脱;兩種方法混合使用時,會對lastIndex值進(jìn)行疊加影響部蛇;
     <script>
         var str="meihao1231meihao443343tiankong23243meihao5";
         var reg=/meihao\d{1}/;
         //1.當(dāng)不填加全局g時摊唇,lastIndex值一直為0;
         console.log(reg.lastIndex);//結(jié)果為:0;
         console.log(reg.exec(str));//結(jié)果為:["meihao1", index: 0, input: "meihao1231meihao443343tiankong23243meihao5", groups: undefined]
         console.log(reg.lastIndex);//結(jié)果為:0涯鲁;
         console.log(reg.exec(str));//結(jié)果為:["meihao1", index: 0, input: "meihao1231meihao443343tiankong23243meihao5", groups: undefined]
         console.log(reg.lastIndex);//結(jié)果為:0巷查;
         console.log(reg.exec(str));//結(jié)果為:["meihao1", index: 0, input: "meihao1231meihao443343tiankong23243meihao5", groups: undefined]
         //2.當(dāng)添加了全局g后,lastIndex值會變化
         //2.1 exec對lastIndex的影響
         var reg1=/meihao\d{1}/g;
         console.log(reg1.lastIndex);//結(jié)果為:0抹腿;
         console.log(reg1.exec(str));//結(jié)果為:["meihao1", index: 0, input: "meihao1231meihao443343tiankong23243meihao5", groups: undefined]
         console.log(reg1.lastIndex);//結(jié)果為:7岛请;
         console.log(reg1.exec(str));//結(jié)果為:["meihao4", index: 10, input: "meihao1231meihao443343tiankong23243meihao5", groups: undefined]
         console.log(reg1.lastIndex);//結(jié)果為:17;
         console.log(reg1.exec(str));//結(jié)果為:["meihao5", index: 35, input: "meihao1231meihao443343tiankong23243meihao5", groups: undefined]
         console.log(reg1.lastIndex);//結(jié)果為:42警绩;
         console.log(reg1.exec(str));//結(jié)果為:null;
         console.log(reg1.lastIndex);//結(jié)果為:0崇败;
         console.log(reg1.exec(str));//結(jié)果為:["meihao1", index: 0, input: "meihao1231meihao443343tiankong23243meihao5", groups: undefined]
         //總結(jié):exec方法會對lastIndex值進(jìn)行影響;lastIndex值記錄本次查找到內(nèi)容后肩祥,內(nèi)容結(jié)尾的下一項的索引值后室,下次再查找時,會繼續(xù)從lastIndex值開始查找混狠;
         //2.2 test對lastIndex的影響
         var reg2=/meihao\d{1}/g;
         console.log(reg2.lastIndex);//結(jié)果為:0岸霹;
         console.log(reg2.test(str));//結(jié)果為:true;
         console.log(reg2.lastIndex);//結(jié)果為:7;
         console.log(reg2.test(str));//結(jié)果為:true;
         console.log(reg2.lastIndex);//結(jié)果為:17将饺;
         console.log(reg2.test(str));//結(jié)果為:true;
         console.log(reg2.lastIndex);//結(jié)果為:42贡避;此時開始查找的位置是最后一位的下一位;后面已經(jīng)沒有東西予弧,所以查找不到對應(yīng)內(nèi)容刮吧;
         console.log(reg2.test(str));//結(jié)果為:false;
         console.log(reg2.lastIndex);//結(jié)果為:0;重新從開始查找掖蛤,循環(huán)杀捻;
         console.log(reg2.test(str));//結(jié)果為:true;
         //總結(jié):test方法會對lastIndex值進(jìn)行影響;lastIndex值記錄本次查找到內(nèi)容后坠七,內(nèi)容結(jié)尾的下一項的索引值水醋,下次再查找時旗笔,會繼續(xù)從lastIndex值開始查找;
         //2.3 兩種方法混合使用對lastIndex值的影響拄踪;
         var reg3=/meihao\d{1}/g;
         console.log(reg3.lastIndex);//結(jié)果為:0蝇恶;
         console.log(reg3.test(str));//結(jié)果為:true;
         console.log(reg3.lastIndex);//結(jié)果為:7;
         console.log(reg3.exec(str));//結(jié)果為:["meihao4", index: 10, input: "meihao1231meihao443343tiankong23243meihao5", groups: undefined]惶桐;
         console.log(reg3.lastIndex);//結(jié)果為:17撮弧;
         console.log(reg3.test(str));//結(jié)果為:true;
         console.log(reg3.lastIndex);//結(jié)果為:42姚糊;
         console.log(reg3.exec(str));//結(jié)果為:null贿衍;
         console.log(reg3.lastIndex);//結(jié)果為:0;
         console.log(reg3.exec(str));//結(jié)果為:["meihao1", index: 0, input: "meihao1231meihao443343tiankong23243meihao5", groups: undefined]救恨;
         //總結(jié):兩種方法混用時贸辈,會對正則上面的屬性lastIndex值進(jìn)行重復(fù)修改;每次校驗或exec捕獲時肠槽,都是從lastIndex值開始擎淤;
     </script>
    
    • 實(shí)例:
     <script>
         var str="alpha(opacity:10)";
         var reg=/alpha\(opacity:(\d+)\)/g;//小括號當(dāng)做字符使用時,需要加轉(zhuǎn)義符秸仙;
         console.log(reg.lastIndex);//結(jié)果為0嘴拢;
         if(reg.test(str)){//此時使用test方法,將lastIndex值改變
             console.log(reg.lastIndex);//結(jié)果為17寂纪;下次操作時席吴,從索引17開始查找;
             console.log(reg.exec(str));//結(jié)果為null;此時exec將lastIndex值再次改變捞蛋;
             console.log(reg.lastIndex);//結(jié)果為0孝冒;
         }else{
             alert(false);
         }
         //正則中添加全局g后,每次進(jìn)行test檢驗或exec捕獲后襟交,都會對lastIndex值進(jìn)行改變迈倍;
     </script>
    

6.RegExp類靜態(tài)屬性

  • RegExp類靜態(tài)屬性:類作為對象角色伤靠,添加的屬性捣域,成為對象的私有屬性,與實(shí)例無關(guān)宴合,但是必須在進(jìn)行test方法或exec方法匹配后焕梅,才可以使用$1來獲取小分組內(nèi)容;
     <script>
         var str="alpha(opacity:10)";
         var reg=/alpha\(opacity:(\d+)\)/;//小括號當(dāng)做字符使用時卦洽,需要加轉(zhuǎn)義符贞言;
         console.log(RegExp.$1);//結(jié)果為:空;意思是默認(rèn)情況下RegExp類對象上不存在$1屬性阀蒂,必須匹配后该窗,才具有弟蚀;
         if(reg.test(str)){
            console.log(RegExp.$1);//結(jié)果為:10;
         }else{
             alert(false);
         }
         //exec方法和test方法酗失,是正則類原型身上的公有屬性义钉;
         //私有屬性必須配合exec方法和test方法使用,指的就是匹配到小分組规肴,才能獲取私有屬性捶闸;
         //$1是正則類作為對象時,身上的私有屬性拖刃,也成為靜態(tài)屬性删壮;
         //其中$1,第一個小分組內(nèi)容;$2兑牡,第二個小分組內(nèi)容
         //不會改變lastIndex屬性央碟;
     </script>
    

7. 重復(fù)子項

  • 定義:重復(fù)子項,就是如"\1","\2"等字符均函,代表的意思是:"\1"指與第一個小分組的樣式一樣硬耍;"\2"指與第二個小分組的樣式一樣;
      <script>
          //重復(fù)子項:就是\1跟第一個小分組一樣边酒;\2跟第二個小分組一樣经柴;
          var reg=/\w(\w)\1(\w)\2/;
          console.log(reg.test("abbcc"));//結(jié)果為:true;
          console.log(reg.test("12233"));//結(jié)果為:true;
          //正則reg的意思是,總共五位數(shù)墩朦,第三位與第二位相同(第一個小分組)坯认,第五位和第四位相同(第二個小分組);
          var reg2=/\w(\w)(\w)\w\1\2/;
          console.log(reg2.test("abcdbc"));//結(jié)果為:true;
          console.log(reg2.test("abcdbb"));//結(jié)果為:false;
          //正則reg2的意思是氓涣,總共六位數(shù)牛哺,第五位與第二位相同(第一個小分組),第六位與第三位相同(第二個小分組)劳吠;
          //重復(fù)子項\1,\2的位置不重要引润,它們代表的是跟小分組一樣的東西;
      </script>
    
  • 實(shí)例:利用重復(fù)子項來統(tǒng)計字母的重復(fù)次數(shù)
    • 思路:
      1. 將str進(jìn)行排序痒玩,按照拼音形式淳附,讓重復(fù)的字母挨在一起;
      2. 書寫正則樣式蠢古,使用replace方法
    • 知識點(diǎn):
      • 字符串轉(zhuǎn)數(shù)組方法奴曙,數(shù)組sort方法,數(shù)組轉(zhuǎn)回字符串方法草讶;
      • 正則表達(dá)式var reg=/(\w)\1+/gi分析:第一位為字母數(shù)字下劃線洽糟,第二位跟第一位相同,"+"代表可以有多個重復(fù)的,"g"代表全局搜索多項坤溃,"i"代表忽略大小寫拍霜;
      • replace方法中回調(diào)函數(shù)的參數(shù)
     <script>
         var str="aaaabbdddDJJJLLLIIEEaaBBDbbcccCCC";
         //第一步:將str進(jìn)行排序,按照拼音形式
         //分析:字符串轉(zhuǎn)數(shù)組薪介,數(shù)組sort方法沉御,數(shù)組轉(zhuǎn)回字符串
         var ary=str.split("");//分離器為空的字符串;
         ary.sort(function (a, b) {
             return a.localeCompare(b);
         });//sort方法昭灵,按照拼音a-z的順序排列吠裆;
         var str2=ary.join("");//連接符為空的字符串;
         // 此時str2為"aaaaaabbbbBBcccCCCdddDDEEIIJJJLLL";
         //第二步:書寫正則樣式烂完,使用replace方法
         var reg=/(\w)\1+/gi;
         //分析:第一位為字母數(shù)字下劃線试疙,第二位跟第一位相同,"+"代表可以有多個重復(fù)的抠蚣,"g"代表全局搜索多項祝旷,"i"代表忽略大小寫;
         var max=0;
         var maxStr="";
         str2.replace(reg,function ($1,$2) {
             //此時嘶窄,獲得的參數(shù)怀跛,第一項為大正則的內(nèi)容,第二項為小分組的內(nèi)容柄冲;
             //$1的長度用于獲取重復(fù)字母的次數(shù)吻谋,$2用于獲取重復(fù)的字母
             //假設(shè)法,判斷最大值现横;
             if($1.length>max){
                 max=$1.length;
                 maxStr=$2;
             }else if($1.length==max){
                 maxStr+="和"+$2;
             }
         });
         console.log("出現(xiàn)的最多的次數(shù)是"+max+"次");//結(jié)果為:出現(xiàn)的最多的次數(shù)是6次
         console.log("出現(xiàn)最多次數(shù)的單詞是:"+maxStr);//結(jié)果為:出現(xiàn)最多次數(shù)的單詞是:a和b和c
     </script>
    

8. 封裝urlParse()方法

  • 需求:封裝方法漓拾,把鏈接中傳給后臺的參數(shù),以一個新對象的形式返回
  • 知識點(diǎn):
    • 封裝方法要封裝到所屬類的原型上戒祠;
    • 正則表達(dá)式var reg=/([^?=&]+)=([^?=&]+)/g;解讀:"[^?=&]"的含義是除了?,=,&這三個符號骇两,"+"多個,"="必須要有等號姜盈;
    • 思路分析:第一低千,封裝方法,this指向字符串實(shí)例對象馏颂,默認(rèn)返回值為字符串實(shí)例對象示血;第二,封裝函數(shù)執(zhí)行的返回值為對象饱亮,所以需要修改構(gòu)造函數(shù)中的返回值矾芙;
 <script>
     //需求:封裝方法,把鏈接中傳給后臺的參數(shù)近上,以一個新對象的形式返回
     //思路:創(chuàng)建正則表達(dá)式,利用replace方法拂铡,查找到滿足規(guī)則的內(nèi)容壹无,通過在正則中添加小分組葱绒,來在回調(diào)函數(shù)中農(nóng)獲取參數(shù);
     var str="https://baike.baidu.com/pic/%E6%9C%B4%E4%BF%A1%E6%83%A0/3420577/0/e61190ef76c6a7eff1edd899f5faaf51f2de6641?fr=lemma&ct=single&pic=e61";
     //鏈接中給后臺傳的參數(shù)斗锭,是在問號之后地淀;
     //封裝方法:封裝到字符串類的原型上
     String.prototype.urlParse=function () {
         //this代表str
         var reg=/([^?=&]+)=([^?=&]+)/g;
         //分析:"[^?=&]"的含義是除了?,=,&這三個符號,"+"多個岖是,"="必須要有等號
         var obj={};
         this.replace(reg,function($0,$1,$2){
             obj[$1]=$2;
         });
         return obj;//如果不填返回值帮毁,會默認(rèn)返回實(shí)例對象,此時返回引用數(shù)據(jù)類型豺撑,會對其重新賦地址烈疚;
     };
     var obj=str.urlParse();
     console.log(obj);//結(jié)果為:{fr: "lemma", ct: "single", pic: "e61"};
 </script>

9. 日期格式化封裝formatDate()方法

  • 獲取日期中的數(shù)據(jù):var str="2018-08-22 20:35:56",獲取字符串中的數(shù)字信息聪轿,返回一個數(shù)組
    • 嚴(yán)格匹配:
      • 思路:通過正則方法爷肝,嚴(yán)格制定捕獲規(guī)則,通過小分組陆错,單獨(dú)獲取每項信息灯抛,然后通過replace中的回調(diào)函數(shù)獲取每項值,但是需要通過call方法來將arguments類數(shù)組轉(zhuǎn)化為數(shù)組音瓷,然后傳入?yún)?shù)对嚼,截取相應(yīng)的項;
       <script>
           var str="2018-08-22 20:35:56";
           var reg=/^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/;
           var ary;
           str.replace(reg,function(){
               ary=Array.prototype.slice.call(arguments,1,arguments.length-2);
           });
           console.log(ary);//結(jié)果為:["2018", "08", "22", "20", "35", "56"]
       </script>
      
    • match方法
      • 思路:制定正則方法绳慎,獲取所有滿足規(guī)則的內(nèi)容猪半;
       <script>
           var str="2018-08-22 20:35:56";
           var reg=/\d+/g;
           var ary=str.match(reg);
           console.log(ary);//結(jié)果為:["2018", "08", "22", "20", "35", "56"]
       </script>
      
    • split方法
      • 思路:制定分離方法,將字符串分割成數(shù)組偷线;
       <script>
           var str="2018-08-22 20:35:56";
           var reg=/[^\d]+/g;//指的是非數(shù)字查找磨确;
           var ary=str.split(reg);
           console.log(ary);//結(jié)果為:["2018", "08", "22", "20", "35", "56"]
       </script>
      
  • 利用日期模板,將日期進(jìn)行轉(zhuǎn)換声邦;
    • 思路:通過正則表達(dá)式中的大正則拿到被替換的內(nèi)容乏奥,通過小分組拿到對應(yīng)的值,作為數(shù)組的索引值亥曹,進(jìn)行替換邓了;
     <script>
         var str="2018-08-22 20:35:56";
         var strTemplate="{0}年{1}月{2}日 {3}時{4}分{5}秒";
         var reg=/\d+/g;
         var ary=str.match(reg);
         var reg2=/{(\d)}/g;
         var str2=strTemplate.replace(reg2,function ($0, $1) {
              return ary[$1];
         });
         console.log(str2);//結(jié)果為:2018年08月22日 20時35分56秒
     </script>
    
  • 封裝日期格式化formatDate()方法
     <script>
         var str="2018-8-22 20:35:56";
         //var strTemplate="{0}年{1}月{2}日 {3}時{4}分{5}秒";此時的strTemplate為默認(rèn)模板,在沒有傳進(jìn)實(shí)參時媳瞪,用此模板骗炉;
         //封裝到字符串原型上;
         String.prototype.formatDate=function(template){
             template=template || "{0}年{1}月{2}日 {3}時{4}分{5}秒";
             //含義:如果傳入實(shí)參蛇受,template就為實(shí)參值句葵,如果不傳實(shí)參,那么template為undefined,給template重新賦值后面的模板乍丈;
             var ary=this.match(/\d+/g);
             var reg=/{(\d)}/g;
             var rem=template.replace(reg,function ($0, $1) {
                 return ary[$1];
             });
             return rem;//此時返回值設(shè)置為字符串剂碴,不是this,也不默認(rèn)返回this轻专;
         };
         var res=str.formatDate();
         console.log(res);//結(jié)果為:2018年8月22日 20時35分56秒
         var res2=str.formatDate("{0}年{1}月{2}日");
         console.log(res2);//結(jié)果為:2018年8月22日
         var res3=str.formatDate("{3}時{4}分{5}秒");
         console.log(res3);//結(jié)果為:20時35分56秒
     </script>
    

10. 知識點(diǎn)積累

10.1 "||"和"&&"的應(yīng)用

  • 知識點(diǎn):
    • 代碼a || b中忆矛,若a為假,返回b请垛;若a為真催训,返回a;
    • 代碼a && b中宗收,若a為真漫拭,返回b;若a為假镜雨,返回a嫂侍;
  • 驗證:
     <script>
         //知識點(diǎn)1:"||"在用于判斷時的應(yīng)用
         var temp="tiankong";
         var mm=temp||"meihao";
         console.log(mm);//結(jié)果為:"tiankong"
         var temp1=false;//可以是undefined,只要為假荚坞;
         var mm1=temp1||"meihao";
         console.log(mm1);//結(jié)果為:"meihao"
         var temp2;
         var ttn=null;
         var mm2=temp2||ttn;
         console.log(mm2);//結(jié)果為:"null"挑宠;
         //總結(jié):總結(jié):代碼a || b 中,1)如果a為真颓影,則不會運(yùn)行b各淀,返回的結(jié)果為a的內(nèi)容,不只是true诡挂,而是a的內(nèi)容;2)如果a為假碎浇,則運(yùn)行b,返回的結(jié)果為b的內(nèi)容璃俗,b可以是真奴璃,也可以是假,返回的都是b;(可以是false,undefind城豁,null)苟穆;
     
         //知識點(diǎn)2:"&&"在用于判斷時的應(yīng)用
         var xmp="tiankong";
         var nn=xmp && "meihao";
         console.log(nn);//結(jié)果為:"meihao";
     
         var xmp1="tiankong";
         var xxn;
         var nn1=xmp1 && xxn;
         console.log(nn1);//結(jié)果為:"undefined"唱星;
     
         var xmp2;
         var nn2=xmp2 && "meihao";
         console.log(nn2);//結(jié)果為:"undefined"雳旅;
     
         var xmp3;
         var xxn3=null;
         var nn3=xmp3 && xxn3;
         console.log(nn3);//結(jié)果為:"undefined";
     
         var xmp4=(4==5);
         var nn4=xmp4 && xxn4;
         console.log(nn4);//結(jié)果為:"false"间聊;
         //總結(jié):代碼a && b 中攒盈,1)如果a為假,則不會運(yùn)行b哎榴,返回的結(jié)果為a的內(nèi)容(可以是false,undefind型豁,null);2)如果a為真僵蛛,則運(yùn)行b,返回的結(jié)果為b的內(nèi)容偷遗,b可以是真墩瞳,也可以是假驼壶,返回的都是b;
     </script>
    
  • 實(shí)例應(yīng)用:函數(shù)調(diào)用時氏豌,"||"對實(shí)參賦值與否的應(yīng)用
     <script>
         var ary=[1,2,3];
         var ary1=[4,5,6];
         function add(arg) {
             //函數(shù)中如果沒有傳實(shí)參,形參值就為undefined热凹;
             arg=arg || ary;
             //含義:如果arg為真泵喘,即函數(shù)中傳入實(shí)參,那么arg就為實(shí)參值般妙;如果arg為假纪铺,即函數(shù)中沒有傳入實(shí)參,那么arg就為ary;
             console.log(arg);
         }
         add();//執(zhí)行函數(shù)后碟渺,打印的結(jié)果為:[1,2,3]鲜锚;
         add(ary1);//執(zhí)行函數(shù)后,打印的結(jié)果為:[4,5,6]苫拍;
     </script>
    

10.2 正則只匹配不捕獲

  • 知識點(diǎn):正則表達(dá)式中芜繁,添加括號會捕獲為小分組內(nèi)容,然后返回在數(shù)組中绒极,現(xiàn)在不想捕獲小分組內(nèi)容骏令,小括號的作用只是分組的作用,提高優(yōu)先級垄提;
  • 代碼:var reg1=/tiankong(?:\d+)/指的是匹配(\d+)的內(nèi)容榔袋,不獲取小分組的內(nèi)容;
     <script>
         var str="tiankong123";
         var reg=/tiankong(\d+)/;
         console.log(reg.exec(str));//結(jié)果為:["tiankong123", "123", index: 0, input: "tiankong123", groups: undefined]
         //需求:只進(jìn)行匹配铡俐,不進(jìn)行捕獲凰兑,即不去捕獲小分組的內(nèi)容;利用"?:";
         var reg1=/tiankong(?:\d+)/;
         console.log(reg1.exec(str));//結(jié)果為:["tiankong123", index: 0, input: "tiankong123", groups: undefined]
     </script>
    

10.3 小括號的用法

  • 分組
  • 提高優(yōu)先級:/^(18|19)$/;驗證18或19审丘;
     <script>
          //目的:驗證18或19
          var reg=/^18|19$/;//分析:1加8或1加9吏够,以1開頭,以9結(jié)尾备恤;
          console.log(reg.test("18219"));//結(jié)果為true;
          console.log(reg.test("119"));//結(jié)果為true;
          //注意:當(dāng)使用|的時候必須加小括號稿饰;
          //正確寫法:
          var reg1=/^(18|19)$/;
          console.log(reg1.test("189"));//結(jié)果為false;
          console.log(reg1.test("18"));//結(jié)果為true;
     </script>
    
  • 小分組:匹配和捕獲
  • 小分組:只匹配不捕獲,小括號中添加?:露泊;
     <script>
         var str="tiankong123";
         var reg=/tiankong(\d+)/;
         console.log(reg.exec(str));//結(jié)果為:["tiankong123", "123", index: 0, input: "tiankong123", groups: undefined]
         //需求:只進(jìn)行匹配喉镰,不進(jìn)行捕獲,即不去捕獲小分組的內(nèi)容惭笑;利用"?:";
         var reg1=/tiankong(?:\d+)/;
         console.log(reg1.exec(str));//結(jié)果為:["tiankong123", index: 0, input: "tiankong123", groups: undefined]
     </script>
    
  • 注意:在正則表達(dá)式中如果需要使用字符()必須要添加轉(zhuǎn)義符"";
     <script>
         var str="alpha(opacity:10)";
         var reg=/alpha\(opacity:10\)/;//小括號當(dāng)做字符使用時侣姆,需要加轉(zhuǎn)義符生真;
         console.log(reg.test(str));//結(jié)果為:true;
     </script>
    

10.4 中括號的用法

  • 中括號中不會出現(xiàn)兩位數(shù);只能出現(xiàn)一個捺宗;
     <script>
          //[abc]意思是abc中的任何一個柱蟀;不會出現(xiàn)兩個;
          var reg=/^[11-89]$/;//分析:1或1-8或9蚜厉,三者中的任何一個
          console.log(reg.test("1"));//結(jié)果為true;
          console.log(reg.test("6"));//結(jié)果為true;6在1-8之間长已;
          console.log(reg.test("11"));//結(jié)果為false;11不在三者之間;
     </script>
    
  • 中括號[]里面的字符意義會發(fā)生改變昼牛,分為兩種
    • 如"+","."這些元字符术瓮,代表加,小數(shù)點(diǎn)贰健;都不用加轉(zhuǎn)義符倍啥;但是在其他的時候必須加轉(zhuǎn)義符才能代表加汇四,小數(shù)點(diǎn)的意思;
      • 對比1:[+-]指的是+或-,二者任何一個诉植;此時中括號中的+號瓢喉,不用加轉(zhuǎn)義符戚绕,就代表加號的含義鉴逞;
      • 對比2:(\+|-)指的是+或-,二者任何一個尝蠕;此時在小括號中的+號需要添加轉(zhuǎn)義符烘豌;才代表加號的含義;
    • 如"\w","\s","\d"這些元字符看彼,帶斜杠的仍然代表元字符的含義廊佩;
    • 中括號和小括號的共同點(diǎn):是在使用或的時候,功能是一樣的靖榕;都代表兩者其一标锄;
      • 中括號:[ab]指的就是a,b二者中任何一個;
      • 小括號:(a|b)指的也是a,b二者中任何一個茁计;
      • 弊端:當(dāng)a料皇,b為數(shù)字時,必須是一位數(shù)時星压,才能用中括號践剂,如果為兩位數(shù),只能用小括號娜膘;如[1234]代表的意思是1234四位數(shù)中的任何一個數(shù)逊脯;而(12|34)代表的是12或34;
      • 注意:盡量不要用小括號竣贪,因為在exec方法捕獲時军洼,會對小括號進(jìn)行小分組巩螃;會導(dǎo)致錯亂;可以用?:解決匕争;

10.5 量詞元字符"?"問號的用法

  • 0或1:代表可有可無避乏;如有效數(shù)字正則表達(dá)式中的使用;
    • 如:(\.\d+)?)代表小括號中的數(shù)據(jù)可有可無甘桑;
  • 解決正則查找中的貪婪性:放在正則捕獲中的量詞元字符后面
    • 如:var reg=/\d+?/g代表捕獲數(shù)字時拍皮,匹配多個數(shù)字的內(nèi)容,但是在輸出的時候扇住,只輸出一個數(shù)字春缕;
  • 只匹配不捕獲:用于小分組盗胀,在小分組中代碼前添加?:;
    • 如:var reg1=/tiankong(?:\d+)/代表的意思是艘蹋,只匹配到(\d+)內(nèi)容,但是不會捕獲(輸出)小分組的內(nèi)容票灰;

11 回調(diào)函數(shù)callback

  • 定義:把函數(shù)的定義階段女阀,作為參數(shù),傳給另外一個函數(shù)屑迂,這個函數(shù)就叫做回調(diào)函數(shù)浸策;
  • 知識點(diǎn):
    • 回調(diào)函數(shù)中的this,一般為window惹盼,可以通過call改變this指向庸汗;
    • callback什么時候被調(diào)用,以及被調(diào)用多少次手报,取決于father這個函數(shù)
    • 回調(diào)函數(shù)可以傳參
    • 回調(diào)函數(shù)的返回值蚯舱,以及賦給的函數(shù)的返回值,回調(diào)函數(shù)被調(diào)用多次掩蛤,會有多個返回值枉昏,然后放在數(shù)組中,以數(shù)組形式返回給father函數(shù)揍鸟;
     <script>
         var obj={};
         function f1(n,m){
             console.log(this+(n+m));
             return "meihao";
         }
         function father(n){
             var ary=[];
             for(var i=0; i<4; i++){
                /* n(2,3);//回調(diào)函數(shù)執(zhí)行兄裂,傳入實(shí)參;this為window;*/
                 n.call(obj,2,3);//改變回調(diào)函數(shù)中的this指向為obj阳藻,并且傳入實(shí)參晰奖;
                 ary.push(n(2,3));//將回調(diào)函數(shù)每次的返回值放進(jìn)數(shù)組;
             }
             return ary;
         }
         var res=father(f1);//函數(shù)在定義階段腥泥,會新建一個堆地址匾南,然后把這個地址賦給函數(shù)名f1,此時把f1作為參數(shù)道川,傳給father函數(shù)午衰,則f1函數(shù)為回調(diào)函數(shù)立宜;
     </script>
    

12 數(shù)組forEach方法

  • 定義:數(shù)組forEach方法作用是遍歷數(shù)組實(shí)例對象,然后執(zhí)行多次回調(diào)函數(shù)臊岸,每次給回調(diào)函數(shù)傳入實(shí)參橙数;
  • 知識點(diǎn):
    • forEach方法可以有兩個參數(shù):callback,thisArg;(第二個參數(shù)是可選的,它是用來改變this指向的);
    • forEach方法中的回調(diào)函數(shù)帅戒,被調(diào)用的次數(shù)跟數(shù)組的長度一樣灯帮,即遍歷數(shù)組;
    • 回調(diào)函數(shù)接收3個參數(shù):item(數(shù)組中的每一項) index(索引) input(原始數(shù)組)逻住;
    • forEach方法本身沒有返回值钟哥;
    • 第二個參數(shù)thisArg,如果不設(shè)置瞎访,則回調(diào)函數(shù)中的this一般指向window腻贰,如果設(shè)置,那么this就指向thisArg值扒秸;
    • 兼容性:IE8及其以下瀏覽器不兼容播演;
     <script>
         //檢驗forEach方法的返回值:如果返回值只有一個undefined,說明forEach方法沒有返回值伴奥;如果接收到的是一個數(shù)組写烤,數(shù)組元素為undefined,那么說明forEach方法有返回值拾徙,但是回調(diào)函數(shù)沒有返回值洲炊;
         var ary=[10,20,30,40,50];
         var obj={};
         var res=ary.forEach(function (item,index,input) {
             console.log(arguments);
             //打印結(jié)果為五個數(shù)組,第一個數(shù)組的內(nèi)容為:[10, 0, Array(5)]尼啡,說明forEach會遍歷數(shù)組暂衡;
         },obj);
         console.log(res);//結(jié)果為:undefined;證明forEach沒有返回值;
     </script>
    

13 封裝瀏覽器兼容的ForEach方法

  • 知識點(diǎn):
    • 瀏覽器兼容與否的判斷條件為:判斷數(shù)組類原型上是否存在forEach屬性玄叠,用in判斷古徒;
    • 封裝思路:分析封裝方法的作用,是否需要傳參數(shù)读恃,是否有返回值隧膘;
  • 封裝思路:
    • 封裝方法,封裝到所屬類的原型上
    • 瀏覽器兼容時寺惫,使用forEach方法疹吃,如果瀏覽器不兼容,那么使用自己封裝的方法西雀;
    • 封裝方法時萨驶,要了解其作用,是否需要參數(shù)艇肴,是否需要返回值
    • forEach方法的作用就是多次調(diào)用回調(diào)函數(shù)腔呜,調(diào)用的次數(shù)為數(shù)組實(shí)例對象的長度叁温,如果添加thisArg值,則在調(diào)用回調(diào)函數(shù)時核畴,改變其this指向膝但;
    • forEach方法中,調(diào)用回調(diào)函數(shù)時谤草,會給其傳入三個實(shí)參跟束,分別是:item數(shù)組每一項,index數(shù)組對應(yīng)項的索引值丑孩, input原始數(shù)組冀宴;
    • forEach方法中不需要返回值;
     <script>
         //需求:封裝forEach瀏覽器都兼容的方法温学,把a(bǔ)ry數(shù)組克隆一份
         var ary=[10,20,30,40,50];
         //瀏覽器兼容與否略贮,判定條件是:不同瀏覽器下數(shù)組類原型對象上是否存在forEach屬性;即利用in來判斷屬性枫浙,a in b 指的是a是否為b的屬性
         //封裝到數(shù)組類的原型上
         Array.prototype.ForEach=function (callback,thisarg) {
             thisarg=thisarg || window;//意思為:如果傳入實(shí)參刨肃,那thisarg就為實(shí)參值,如果沒有傳入實(shí)參箩帚,那么thisarg為window;其中window為對象;
             //此時this代表的是數(shù)組ary;
             //1)如果瀏覽器兼容,直接用瀏覽器支持的屬性黄痪;
             if("forEach" in Array.prototype){
                 this.forEach(callback,thisarg);
               //Array.prototype.forEach.call(this,callback,thisarg);也可以寫此行代碼紧帕;
                 return;//阻斷程序執(zhí)行;不需要返回值桅打;
             }
             //2)不兼容的時候封裝一個方法
             //方法會傳兩個實(shí)參是嗜,一個是回調(diào)函數(shù)的定義階段,一個是thisArg;
             //方法的作用挺尾,就是對回調(diào)函數(shù)進(jìn)行多次調(diào)用鹅搪,次數(shù)為數(shù)組實(shí)例對象的長度;
            for(var i=0; i<this.length; i++) {
                callback.call(thisarg, this[i], i, this);
                //沒有返回值遭铺,所以不需要添加return丽柿;
            }
         };
         function fn(item,index,input) {
              console.log(arguments);
         }
         ary.ForEach(fn);
     </script>
    

14 數(shù)組map方法

  • 定義:數(shù)組map方法代碼格式跟forEach方法一樣,也是遍歷數(shù)組魂挂,多次調(diào)用回調(diào)函數(shù)甫题,改變回調(diào)函數(shù)this指向,但是唯一不同的是涂召,map方法有返回值坠非,返回值為一個數(shù)組,數(shù)組元素為回調(diào)函數(shù)每次執(zhí)行后的返回值果正;
  • 知識點(diǎn):
    • map方法唯一的不同是炎码,存在返回值盟迟,返回值為一個數(shù)組,由回調(diào)函數(shù)每次執(zhí)行后的返回值組成潦闲;
    • map方法的其他特性跟forEach方法一樣队萤;
    • map方法:IE8及其以下瀏覽器不兼容;
     <script>
         var ary=[10,20,30,40,50];
         var res=ary.map(function (item, index, input) {
             return item+index;
         });
         console.log(res);//結(jié)果為:[10, 21, 32, 43, 54]
     </script>
    

15 封裝瀏覽器兼容的Map方法

  • 知識點(diǎn):
    • 與forEach方法不同點(diǎn),map方法具有返回值;
     <script>
         var ary=[10,20,30,40,50];
         //封裝方法要在所屬類的原型上封裝
         Array.prototype.Map=function (callback, thisarg) {
             thisarg=thisarg || window;
             if("map" in Array.prototype){
                 return this.map(callback,thisarg);
             }
             var ary1=[];
             for(var i=0; i<this.length; i++){
                 var rem=callback.call(thisarg,this[i],i,this);
                 ary1.push(rem);
             }
             return ary1;
         };
         function fn($1,$2) {
             return $1*$2;
         }
         var res=ary.Map(fn);
         console.log(res);//結(jié)果為:[0, 20, 60, 120, 200]
     </script>
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矫钓,一起剝皮案震驚了整個濱河市要尔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌新娜,老刑警劉巖赵辕,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異概龄,居然都是意外死亡还惠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門私杜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚕键,“玉大人,你說我怎么就攤上這事衰粹÷喙猓” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵铝耻,是天一觀的道長誊爹。 經(jīng)常有香客問我,道長瓢捉,這世上最難降的妖魔是什么频丘? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮泡态,結(jié)果婚禮上搂漠,老公的妹妹穿的比我還像新娘。我一直安慰自己某弦,他們只是感情好桐汤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刀崖,像睡著了一般惊科。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亮钦,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天馆截,我揣著相機(jī)與錄音,去河邊找鬼。 笑死蜡娶,一個胖子當(dāng)著我的面吹牛混卵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窖张,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼幕随,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宿接?” 一聲冷哼從身側(cè)響起赘淮,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睦霎,沒想到半個月后梢卸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡副女,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年蛤高,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碑幅。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡戴陡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沟涨,到底是詐尸還是另有隱情恤批,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布拷窜,位于F島的核電站开皿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏篮昧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一笋妥、第九天 我趴在偏房一處隱蔽的房頂上張望懊昨。 院中可真熱鬧,春花似錦春宣、人聲如沸酵颁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽躏惋。三九已至,卻和暖如春嚷辅,著一層夾襖步出監(jiān)牢的瞬間簿姨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扁位,地道東北人准潭。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像域仇,于是被迫代替她去往敵國和親刑然。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 1.1 正則基礎(chǔ) 正則的含義:由特定的符號組成的具有特殊含義的代碼暇务; 正則的目的:就是制定一些規(guī)則泼掠,來操作(校驗/...
    果木山閱讀 95評論 0 0
  • 前言 最先接觸編程的知識是在大學(xué)里面择镇,大學(xué)里面學(xué)了一些基礎(chǔ)的知識,c語言蝠检,java語言沐鼠,單片機(jī)的匯編語言等;大學(xué)畢...
    oceanfive閱讀 3,068評論 0 7
  • --------------------------正則的作用--------------------------...
    G_whk閱讀 618評論 1 5
  • 前言 作為一個程序員叹谁,要出去裝逼饲梭,手中必備的技能就是正則表達(dá)式。程序員的正則表達(dá)式焰檩,醫(yī)生的處方和道士的鬼畫符憔涉,都是...
    Layzimo閱讀 549評論 0 6
  • //定義正則表達(dá)式的兩種方式,在用構(gòu)造函數(shù)的時候析苫,有些地方是要加轉(zhuǎn)義字符的兜叨。 //1、字面量衩侥。 var reg =...
    xiaobing0324閱讀 494評論 0 0