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ù)
- 思路:
- 利用對象的不重名特性捍壤,統(tǒng)計單詞,以及出現(xiàn)的次數(shù)
- 找到出現(xiàn)最多的次數(shù)鞍爱;假設(shè)法
- 通過次數(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ù)
- 思路:
- 將str進(jìn)行排序痒玩,按照拼音形式淳附,讓重復(fù)的字母挨在一起;
- 書寫正則樣式蠢古,使用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>
- 嚴(yán)格匹配:
- 利用日期模板,將日期進(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)義符烘豌;才代表加號的含義;
- 對比1:
- 如"\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)致錯亂;可以用
?:
解決匕争;
- 中括號:
- 如"+","."這些元字符术瓮,代表加,小數(shù)點(diǎn)贰健;都不用加轉(zhuǎn)義符倍啥;但是在其他的時候必須加轉(zhuǎn)義符才能代表加汇四,小數(shù)點(diǎn)的意思;
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>