javascript常用实例的实现与封装

2-1去除字符串空格

//去除空格  type 1-所有空格  2-前后空格  3-前空格 4-后空格functiontrim(str,type){switch(type){case1:returnstr.replace(/\s+/g,"");case2:returnstr.replace(/(^\s*)|(\s*$)/g,"");case3:returnstr.replace(/(^\s*)/g,"");case4:returnstr.replace(/(\s*$)/g,"");default:returnstr;    }}

2-2字母大小写切换

/*type

1:首字母大写

2:首页母小写

3:大小写转换

4:全部大写

5:全部小写

* *///changeCase('asdasd',1)//AsdasdfunctionchangeCase(str,type){functionToggleCase(str){varitemText =""str.split("").forEach(function(item){if(/^([a-z]+)/.test(item)) {                    itemText += item.toUpperCase();                }elseif(/^([A-Z]+)/.test(item)) {                    itemText += item.toLowerCase();                }else{                    itemText += item;                }            });returnitemText;    }switch(type) {case1:returnstr.replace(/^(\w)(\w+)/,function(v, v1, v2){returnv1.toUpperCase() + v2.toLowerCase();            });case2:returnstr.replace(/^(\w)(\w+)/,function(v, v1, v2){returnv1.toLowerCase() + v2.toUpperCase();            });case3:returnToggleCase(str);case4:returnstr.toUpperCase();case5:returnstr.toLowerCase();default:returnstr;    }}

2-3字符串循环复制

//repeatStr(str->字符串, count->次数)//repeatStr('123',3)//"123123123"function repeatStr(str,count) {    vartext='';for(var i =0; i

2-4字符串替换

//字符串替换(字符串,要替换的字符,替换成什么)functionreplaceAll(str,AFindText,ARepText){   raRegExp =newRegExp(AFindText,"g");returnstr.replace(raRegExp,ARepText);}

2-5替换*

//replaceStr(字符串,字符格式, 替换方式,替换的字符(默认*))functionreplaceStr(str, regArr,type,ARepText){varregtext ='', Reg =null,replaceText=ARepText||'*';//replaceStr('18819322663',[3,5,3],0)//188*****663//repeatStr是在上面定义过的(字符串循环复制),大家注意哦if(regArr.length ===3&&type===0) {        regtext ='(\\w{'+ regArr[0] +'})\\w{'+ regArr[1] +'}(\\w{'+ regArr[2] +'})'Reg =newRegExp(regtext);varreplaceCount = repeatStr(replaceText, regArr[1]);returnstr.replace(Reg,'$1'+ replaceCount +'$2')    }//replaceStr('asdasdasdaa',[3,5,3],1)//***asdas***elseif(regArr.length ===3&&type===1) {        regtext ='\\w{'+ regArr[0] +'}(\\w{'+ regArr[1] +'})\\w{'+ regArr[2] +'}'Reg =newRegExp(regtext);varreplaceCount1 = repeatSte(replaceText, regArr[0]);varreplaceCount2 = repeatSte(replaceText, regArr[2]);returnstr.replace(Reg, replaceCount1 +'$1'+ replaceCount2)    }//replaceStr('1asd88465asdwqe3',[5],0)//*****8465asdwqe3elseif(regArr.length ===1&&type==0) {        regtext ='(^\\w{'+ regArr[0] +'})'Reg =newRegExp(regtext);varreplaceCount = repeatSte(replaceText, regArr[0]);returnstr.replace(Reg, replaceCount)    }//replaceStr('1asd88465asdwqe3',[5],1,'+')//"1asd88465as+++++"elseif(regArr.length ===1&&type==1) {        regtext ='(\\w{'+ regArr[0] +'}$)'Reg =newRegExp(regtext);varreplaceCount = repeatSte(replaceText, regArr[0]);returnstr.replace(Reg, replaceCount)    }}

2-6检测字符串

//checkType('165226226326','phone')//false//大家可以根据需要扩展functioncheckType(str,type){switch(type) {case'email':return/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);case'phone':return/^1[3|4|5|7|8][0-9]{9}$/.test(str);case'tel':return/^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);case'number':return/^[0-9]$/.test(str);case'english':return/^[a-zA-Z]+$/.test(str);case'chinese':return/^[\u4E00-\u9FA5]+$/.test(str);case'lower':return/^[a-z]+$/.test(str);case'upper':return/^[A-Z]+$/.test(str);default:returntrue;    }}

2-7检测密码强度

//checkPwd('12asdASAD')//3(强度等级为3)functioncheckPwd(str){varnowLv =0;if(str.length <6) {returnnowLv    }    ;if(/[0-9]/.test(str)) {        nowLv++    }    ;if(/[a-z]/.test(str)) {        nowLv++    }    ;if(/[A-Z]/.test(str)) {        nowLv++    }    ;if(/[\.|-|_]/.test(str)) {        nowLv++    }    ;returnnowLv;}

2-8随机码(toString详解

//count取值范围0-36//randomNumber(10)//"2584316588472575"//randomNumber(14)//"9b405070dd00122640c192caab84537"//Math.random().toString(36).substring(2);//"83vhdx10rmjkyb9"functionrandomNumber(count){returnMath.random().toString(count).substring(2);}

2-9查找字符串

可能标题会有点误导,下面我就简单说明一个需求,在字符串'sad44654blog5a1sd67as9dablog4s5d16zxc4sdweasjkblogwqepaskdkblogahseiuadbhjcibloguyeajzxkcabloguyiwezxc967'中找出'blog'的出现次数。代码如下

functioncountStr(str,strSplit){returnstr.split(strSplit).length-1}varstrTest='sad44654blog5a1sd67as9dablog4s5d16zxc4sdweasjkblogwqepaskdkblogahseiuadbhjcibloguyeajzxkcabloguyiwezxc967'//countStr(strTest,'blog')//6

3.数组操作

3-1数组去重

这个方法是在太多了,我之前写的文章(js数组操作--使用迭代方法替代for循环,js关键词变色,数组打乱,数组去重的实现和封装)也有提到,我今天这里就写一种之前没用过的方法。

//ES6新增的Set数据结构,类似于数组,但是里面的元素都是唯一的 ,其构造函数可以接受一个数组作为参数//let arr=[1,2,1,2,6,3,5,69,66,7,2,1,4,3,6,8,9663,8]//let set = new Set(array);//{1,2,6,3,5,69,66,7,4,8,9663}//ES6中Array新增了一个静态方法from,可以把类似数组的对象转换为数组//Array.from(set)//[1,2,6,3,5,69,66,7,4,8,9663]functionremoveRepeatArray(arr){returnArray.from(newSet(arr))}

3-2数组顺序打乱

functionupsetArr(arr){returnarr.sort(function(){returnMath.random() -0.5});}

3-3数组最大值最小值

//这一块的封装,主要是针对数字类型的数组functionmaxArr(arr){returnMath.max.apply(null,arr);}functionminArr(arr){returnMath.min.apply(null,arr);}

3-4数组求和,平均值

//这一块的封装,主要是针对数字类型的数组//求和functionsumArr(arr){varsumText=0;for(vari=0,len=arr.length;i

3-5从数组中随机获取元素

//randomOne([1,2,3,6,8,5,4,2,6])//2//randomOne([1,2,3,6,8,5,4,2,6])//8//randomOne([1,2,3,6,8,5,4,2,6])//8//randomOne([1,2,3,6,8,5,4,2,6])//1functionrandomOne(arr){returnarr[Math.floor(Math.random() * arr.length)];}

3-6返回数组(字符串)一个元素出现的次数

//getEleCount('asd56+asdasdwqe','a')//3//getEleCount([1,2,3,4,5,66,77,22,55,22],22)//2functiongetEleCount(obj, ele){varnum =0;for(vari =0, len = obj.length; i < len; i++) {if(ele == obj[i]) {            num++;        }    }returnnum;}

3-7返回数组(字符串)出现最多的几次元素和出现次数

//arr, rank->长度,默认为数组长度,ranktype,排序方式,默认降序functiongetCount(arr, rank,ranktype){varobj = {}, k, arr1 = []//记录每一元素出现的次数for(vari =0, len = arr.length; i < len; i++) {        k = arr[i];if(obj[k]) {            obj[k]++;        }else{            obj[k] =1;        }    }//保存结果{el-'元素',count-出现次数}for(varoinobj) {        arr1.push({el: o, count: obj[o]});    }//排序(降序)arr1.sort(function(n1, n2){returnn2.count - n1.count    });//如果ranktype为1,则为升序,反转数组if(ranktype===1){        arr1=arr1.reverse();    }varrank1 = rank || arr1.length;returnarr1.slice(0,rank1);}

getCount([1,2,3,1,2,5,2,4,1,2,6,2,1,3,2])

默认情况,返回所有元素出现的次数

getCount([1,2,3,1,2,5,2,4,1,2,6,2,1,3,2],3)

传参(rank=3),只返回出现次数排序前三的

getCount([1,2,3,1,2,5,2,4,1,2,6,2,1,3,2],null,1)

传参(ranktype=1,rank=null),升序返回所有元素出现次数

getCount([1,2,3,1,2,5,2,4,1,2,6,2,1,3,2],3,1)

传参(rank=3,ranktype=1),只返回出现次数排序(升序)前三的

3-8得到n1-n2下标的数组

//getArrayNum([0,1,2,3,4,5,6,7,8,9],5,9)//[5, 6, 7, 8, 9]//getArrayNum([0,1,2,3,4,5,6,7,8,9],2) 不传第二个参数,默认返回从n1到数组结束的元素//[2, 3, 4, 5, 6, 7, 8, 9]functiongetArrayNum(arr,n1,n2){vararr1=[],len=n2||arr.length-1;for(vari=n1;i<=len;i++){        arr1.push(arr[i])    }returnarr1;}

3-9筛选数组

/删除值为'val'的数组元素//removeArrayForValue(['test','test1','test2','test','aaa'],'test','%')//["aaa"]  带有'test'的都删除    //removeArrayForValue(['test','test1','test2','test','aaa'],'test')//["test1","test2","aaa"]  //数组元素的值全等于'test'才被删除functionremoveArrayForValue(arr,val,type){    arr.filter(function(item){returntype==='%'?item.indexOf(val)!==-1:item!==val})}

4.基础DOM操作

这个部分代码其实参考jquery的一些函数写法,唯一区别就是调用不用,参数一样.比如下面的栗子

//设置对象内容jquery:$('#xxx').html('hello world');现在:html(document.getElementById('xxx'),'hello world')//获取对象内容jquery:$('#xxx').html();现在:html(document.getElementById('xxx'))

4-1检测对象是否有哪个类名

functionhasClass(obj,classStr){vararr=obj.className.split(/\s+/);//这个正则表达式是因为class可以有多个,判断是否包含return(arr.indexOf(classStr)==-1)?false:true;},

4-2添加类名

functionaddClass(obj,classStr){if(!this.hasClass(obj,classStr)){obj.className +=" "+ classStr};},

4-3删除类名

functionremoveClass(obj,classStr){if(this.hasClass(obj,classStr)) {varreg =newRegExp('(\\s|^)'+ classStr +'(\\s|$)');        obj.className = obj.className.replace(reg,'');    }},

4-4替换类名("被替换的类名","替换的类名")

functionreplaceClass(obj,newName,oldName) {    removeClass(obj,oldName);    addClass(obj,newName);}

4-5获取兄弟节点

functionsiblings(obj){vara=[];//定义一个数组,用来存o的兄弟元素varp=obj.previousSibling;while(p){//先取o的哥哥们 判断有没有上一个哥哥元素,如果有则往下执行 p表示previousSiblingif(p.nodeType===1){        a.push(p);        }        p=p.previousSibling//最后把上一个节点赋给p}    a.reverse()//把顺序反转一下 这样元素的顺序就是按先后的了varn=obj.nextSibling;//再取o的弟弟while(n){//判断有没有下一个弟弟结点 n是nextSibling的意思if(n.nodeType===1){            a.push(n);        }        n=n.nextSibling;    }returna;},

4-6设置样式

functioncss(obj,json){for(varattrinjson){        obj.style[attr]=json[attr];    }}

4-7设置文本内容

functionhtml(obj){if(arguments.length==0){returnthis.innerHTML;    }elseif(arguments.length==1){this.innerHTML=arguments[0];    }}

4-8显示隐藏

functionshow(obj){    obj.style.display="";}functionhide(obj){    obj.style.display="none";}

5.其他操作

5-1cookie

//cookie//设置cookiefunctionsetCookie(name,value,iDay){varoDate=newDate();    oDate.setDate(oDate.getDate()+iDay);document.cookie=name+'='+value+';expires='+oDate;}//获取cookiefunctiongetCookie(name){vararr=document.cookie.split('; ');for(vari=0;i

5-2清除对象中值为空的属性

//filterParams({a:"",b:null,c:"010",d:123})//Object {c: "010", d: 123}functionfilterParams(obj){let_newPar = {};for(letkeyinobj) {if((obj[key] ===0|| obj[key]) && obj[key].toString().replace(/(^\s*)|(\s*$)/g,'') !=='') {            _newPar[key] = obj[key];        }    }return_newPar;}

5-3现金额大写转换函数

//upDigit(168752632)//"人民币壹亿陆仟捌佰柒拾伍万贰仟陆佰叁拾贰元整"//upDigit(1682)//"人民币壹仟陆佰捌拾贰元整"//upDigit(-1693)//"欠人民币壹仟陆佰玖拾叁元整"functionupDigit(n){varfraction = ['角','分','厘'];vardigit = ['零','壹','贰','叁','肆','伍','陆','柒','捌','玖'];varunit = [ ['元','万','亿'], ['','拾','佰','仟']  ];varhead = n <0?'欠人民币':'人民币';      n =Math.abs(n);vars ='';for(vari =0; i < fraction.length; i++)      {        s += (digit[Math.floor(n *10*Math.pow(10, i)) %10] + fraction[i]).replace(/零./,'');    }    s = s ||'整';      n =Math.floor(n);for(vari =0; i < unit[0].length && n >0; i++)      {varp ='';for(varj =0; j < unit[1].length && n >0; j++)          {              p = digit[n %10] + unit[1][j] + p;            n =Math.floor(n /10);        }//s = p.replace(/(零.)*零$/, '').replace(/^$/, '零')+ unit[0][i] + s;s = p+ unit[0][i] + s;    }returnhead + s.replace(/(零.)*零元/,'元').replace(/(零.)+/g,'零').replace(/^整$/,'零元整');}

5-4获取,设置url参数

//获取url参数//getUrlPrmt('segmentfault.com/write?draftId=122000011938')//Object{draftId: "122000011938"}functiongetUrlPrmt(url){url=url?url:window.location.href;let_pa =url.substring(url.indexOf('?') +1), _arrS = _pa.split('&'), _rs = {};for(leti =0, _len = _arrS.length; i < _len; i++) {letpos = _arrS[i].indexOf('=');if(pos ==-1) {continue;        }letname = _arrS[i].substring(0, pos), value =window.decodeURIComponent(_arrS[i].substring(pos +1));        _rs[name] = value;    }return_rs;}//设置url参数//setUrlPrmt({'a':1,'b':2})//a=1&b=2functionsetUrlPrmt(obj){let_rs = [];for(letpinobj) {if(obj[p] !=null&& obj[p] !='') {            _rs.push(p +'='+ obj[p])        }    }return_rs.join('&');}

5-5随机返回一个范围的数字

functionrandomNumber(n1,n2){//randomNumber(5,10)//返回5-10的随机整数,包括5,10if(arguments.length===2){returnMath.round(n1+Math.random()*(n2-n1));    }//randomNumber(10)//返回0-10的随机整数,包括0,10elseif(arguments.length===1){returnMath.round(Math.random()*n1)    }//randomNumber()//返回0-255的随机整数,包括0,255else{returnMath.round(Math.random()*255)    }  }

5-6随进产生颜色

functionrandomColor(){//randomNumber是上面定义的函数//写法1return'rgb('+ randomNumber(255) +','+ randomNumber(255) +','+ randomNumber(255) +')';//写法2return'#'+Math.random().toString(16).substring(2).substr(0,6);//写法3varcolor='#';for(vari=0;i<6;i++){color+='0123456789abcdef'[randomNumber(15)];    }returncolor;}

//这种写法,偶尔会有问题。大家得注意哦

//Math.floor(Math.random()*0xffffff).toString(16);

5-7Date日期时间部分

//到某一个时间的倒计时//getEndTime('2017/7/22 16:0:0')//"剩余时间6天 2小时 28 分钟20 秒"functiongetEndTime(endTime){varstartDate=newDate();//开始时间,当前时间varendDate=newDate(endTime);//结束时间,需传入时间参数vart=endDate.getTime()-startDate.getTime();//时间差的毫秒数vard=0,h=0,m=0,s=0;if(t>=0){      d=Math.floor(t/1000/3600/24);      h=Math.floor(t/1000/60/60%24);      m=Math.floor(t/1000/60%60);      s=Math.floor(t/1000%60);    }return"剩余时间"+d+"天 "+h+"小时 "+m+" 分钟"+s+" 秒";}

5-8适配rem

这个适配的方法很多,我就写我自己用的方法。大家也可以去我回答过得一个问题那里看更详细的说明!移动端适配问题

functiongetFontSize(){vardoc=document,win=window;vardocEl = doc.documentElement,    resizeEvt ='orientationchange'inwindow?'orientationchange':'resize',    recalc =function(){varclientWidth = docEl.clientWidth;if(!clientWidth)return;//如果屏幕大于750(750是根据我效果图设置的,具体数值参考效果图),就设置clientWidth=750,防止font-size会超过100pxif(clientWidth>750){clientWidth=750}//设置根元素font-size大小docEl.style.fontSize =100* (clientWidth /750) +'px';    };//屏幕大小改变,或者横竖屏切换时,触发函数win.addEventListener(resizeEvt, recalc,false);//文档加载完成时,触发函数doc.addEventListener('DOMContentLoaded', recalc,false);}//使用方式很简单,比如效果图上,有张图片。宽高都是100px;//样式写法就是img{width:1rem;    height:1rem;}//这样的设置,比如在屏幕宽度大于等于750px设备上,1rem=100px;图片显示就是宽高都是100px//比如在iphone6(屏幕宽度:375)上,375/750*100=50px;就是1rem=50px;图片显示就是宽高都是50px;

6.封装成形

写了这么多的操作,小伙伴应该发现了一问题,全局函数太多了

//这样的话,封装了几个操作,就增加了几个全局函数,污染了全局变量,在开发中应该尽量避免全局变量。不说别的,如果一个项目,几个人开发,很有可能会造成命名的冲突。function setUrlPrmt(obj){..}function getUrlPrmt(url){..}function upsetArr(obj){..}//所以,建议的封装姿势是varmyJS={    setUrlPrmt:function(obj){..},    getUrlPrmt:function(url){..},    upsetArr:function(arr){..},}这样就算别人也写这样的函数,也不会造成冲突。全局变量也只有一个,加上别人也不会很多!varotherJS={    setUrlPrmt:function(obj){..},    getUrlPrmt:function(url){..},    upsetArr:function(arr){..},}//最后,封装的效果是varmyJS={    //去除字符串空格    trim:function(obj){..},    //字母大小写切换    changeCase:function(obj){..},    //字符串循环复制    repeatStr:function(str){..},    .....}//如果是es6的模块化开发,大家也可以letmyJS={    //去除字符串空格    trim:function(obj){..},    //字母大小写切换    changeCase:function(obj){..},    //字符串循环复制    repeatStr:function(str){..},    .....}//暴露模块,里面的方式大家也可以用es6方式实现,代码至少会少一点!export{myJS}

可能有小伙伴会有疑问,这样封装,调用有点麻烦,为什么不直接在原型上面封装,调用方便。比如下面的栗子!

String.prototype.trim=function(type){switch(type){case1:returnthis.replace(/\s+/g,"");case2:returnthis.replace(/(^\s*)|(\s*$)/g,"");case3:returnthis.replace(/(^\s*)/g,"");case4:returnthis.replace(/(\s*$)/g,"");default:returnthis;    }}//'  12345 6 8 96  '.trim(1)//"123456896"//比这样trim('  12345 6 8 96  ',1)调用方便。//但是,这样是不推荐的做法,这样就污染了原生对象String,别人创建的String也会被污染,造成不必要的开销。//更可怕的是,万一自己命名的跟原生的方法重名了,就被覆盖原来的方法了//String.prototype.substr=function(){console.log('asdasd')}//'asdasdwe46546'.substr()//asdasd//substr方法有什么作用,大家应该知道,不知道的可以去w3c看下

所以在原生对象原型的修改很不推荐!至少很多的公司禁止这样操作!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容