JavaScript 有用的代码片段和 trick
浮点数取整
constx=123.4545; x>>0;//123 ~~x;//123 x|0;//123 Math.floor(x);//123
注意:前三种方法只适用于32个位整数,对于负数的处理上和Math.floor是不同的。
Math.floor(-12.53);//-13 -12.53|0;//-12
生成6位数字验证码
//方法一 ('000000'+Math.floor(Math.random()*999999)).slice(-6); //方法二 Math.random().toString().slice(-6); //方法三 Math.random().toFixed(6).slice(-6); //方法四 ''+Math.floor(Math.random()*999999);
16进制颜色代码生成
(function(){ return'#'+('00000'+ (Math.random()*0x1000000<<0).toString(16)).slice(-6); })();
驼峰命名转下划线
'componentMapModelRegistry'.match(/^[a-z][a-z0-9]+|[A-Z][a-z0-9]*/g).join('_').toLowerCase();//component_map_model_registry
url查询参数转json格式
//ES6 constquery=(search='')=>((querystring='')=>(q=>(querystring.split('&').forEach(item=>(kv=>kv[0]&&(q[kv[0]]=kv[1]))(item.split('='))),q))({}))(search.split('?')[1]); //对应ES5实现 varquery=function(search){ if(search===void0){search='';} return(function(querystring){ if(querystring===void0){querystring='';} return(function(q){ return(querystring.split('&').forEach(function(item){ return(function(kv){ returnkv[0]&&(q[kv[0]]=kv[1]); })(item.split('=')); }),q); })({}); })(search.split('?')[1]); }; query('?key1=value1&key2=value2');//es6.html:14{key1:"value1",key2:"value2"}
获取URL参数
functiongetQueryString(key){ varreg=newRegExp("(^|&)"+key+"=([^&]*)(&|$)"); varr=window.location.search.substr(1).match(reg); if(r!=null){ returnunescape(r[2]); } returnnull; }
n维数组展开成一维数组
varfoo=[1,[2,3],['4',5,['6',7,[8]]],[9],10]; //方法一 //限制:数组项不能出现`,`,同时数组项全部变成了字符数字 foo.toString().split(',');//["1","2","3","4","5","6","7","8","9","10"] //方法二 //转换后数组项全部变成数字了 eval('['+foo+']');//[1,2,3,4,5,6,7,8,9,10] //方法三,使用ES6展开操作符 //写法太过麻烦,太过死板 [1,...[2,3],...['4',5,...['6',7,...[8]]],...[9],10];//[1,2,3,"4",5,"6",7,8,9,10] //方法四 JSON.parse(`[${JSON.stringify(foo).replace(/\[|]/g,'')}]`);//[1,2,3,"4",5,"6",7,8,9,10] //方法五 constflatten=(ary)=>ary.reduce((a,b)=>a.concat(Array.isArray(b)?flatten(b):b),[]); flatten(foo);//[1,2,3,"4",5,"6",7,8,9,10] //方法六 functionflatten(a){ returnArray.isArray(a)?[].concat(...a.map(flatten)):a;
注:更多方法请参考《HowtoflattennestedarrayinJavaScript?》
日期格式化
//方法一 functionformat1(x,y){ varz={ y:x.getFullYear(), M:x.getMonth()+1, d:x.getDate(), h:x.getHours(), m:x.getMinutes(), s:x.getSeconds() }; returny.replace(/(y+|M+|d+|h+|m+|s+)/g,function(v){ return((v.length>1?"0":"")+eval('z.'+v.slice(-1))).slice(-(v.length>2?v.length:2)) }); } format1(newDate(),'yy-M-dh:m:s');//17-10-1422:14:41 //方法二 Date.prototype.format=function(fmt){ varo={ "M+":this.getMonth()+1,//月份 "d+":this.getDate(),//日 "h+":this.getHours(),//小时 "m+":this.getMinutes(),//分 "s+":this.getSeconds(),//秒 "q+":Math.floor((this.getMonth()+3)/3),//季度 "S":this.getMilliseconds()//毫秒 }; if(/(y+)/.test(fmt)){ fmt=fmt.replace(RegExp.$1,(this.getFullYear()+"").substr(4-RegExp.$1.length)); } for(varkino){ if(newRegExp("("+k+")").test(fmt)){ fmt=fmt.replace(RegExp.$1,(RegExp.$1.length==1)?(o[k]):(("00"+o[k]).substr((""+o[k]).length))); } } returnfmt; } newDate().format('yy-M-dh:m:s');//17-10-1422:18:17
特殊字符转义
functionhtmlspecialchars(str){ varstr=str.toString().replace(/&/g,"&").replace(//g,">").replace(/"/g,'"'); returnstr; } htmlspecialchars('&jfkds<>');//"&jfkds<>"
动态插入js
functioninjectScript(src){ vars,t; s=document.createElement('script'); s.type='text/javascript'; s.async=true; s.src=src; t=document.getElementsByTagName('script')[0]; t.parentNode.insertBefore(s,t); }
格式化数量
//方法一 functionformatNum(num,n){ if(typeofnum=="number"){ num=String(num.toFixed(n||0)); varre=/(-?\d+)(\d{3})/; while(re.test(num))num=num.replace(re,"$1,$2"); returnnum; } returnnum; } formatNum(2313123,3);//"2,313,123.000" //方法二 '2313123'.replace(/\B(?=(\d{3})+(?!\d))/g,',');//"2,313,123" //方法三 functionformatNum(str){ returnstr.split('').reverse().reduce((prev,next,index)=>{ return((index%3)?next:(next+','))+prev }); } formatNum('2313323');//"2,313,323"
身份证验证
functionchechCHNCardId(sNo){ if(!this.regExpTest(sNo,/^[0-9]{17}[X0-9]$/)){ returnfalse; } sNo=sNo.toString(); vara,b,c; a=parseInt(sNo.substr(0,1))*7+parseInt(sNo.substr(1,1))*9+parseInt(sNo.substr(2,1))*10; a=a+parseInt(sNo.substr(3,1))*5+parseInt(sNo.substr(4,1))*8+parseInt(sNo.substr(5,1))*4; a=a+parseInt(sNo.substr(6,1))*2+parseInt(sNo.substr(7,1))*1+parseInt(sNo.substr(8,1))*6; a=a+parseInt(sNo.substr(9,1))*3+parseInt(sNo.substr(10,1))*7+parseInt(sNo.substr(11,1))*9; a=a+parseInt(sNo.substr(12,1))*10+parseInt(sNo.substr(13,1))*5+parseInt(sNo.substr(14,1))*8; a=a+parseInt(sNo.substr(15,1))*4+parseInt(sNo.substr(16,1))*2; b=a%11; if(b==2){ c=sNo.substr(17,1).toUpperCase(); }else{ c=parseInt(sNo.substr(17,1)); } switch(b){ case0: if(c!=1){ returnfalse; } break; case1: if(c!=0){ returnfalse; } break; case2: if(c!="X"){ returnfalse; } break; case3: if(c!=9){ returnfalse; } break; case4: if(c!=8){ returnfalse; } break; case5: if(c!=7){ returnfalse; } break; case6: if(c!=6){ returnfalse; } break; case7: if(c!=5){ returnfalse; } break; case8: if(c!=4){ returnfalse; } break; case9: if(c!=3){ returnfalse; } break; case10: if(c!=2){ returnfalse; }; } returntrue; }
测试质数
functionisPrime(n){ return!(/^.?$|^(..+?)\1+$/).test('1'.repeat(n)) }
统计字符串中相同字符出现的次数
vararr='abcdaabc'; varinfo=arr .split('') .reduce((p,k)=>(p[k]++||(p[k]=1),p),{}); console.log(info);//{a:3,b:2,c:2,d:1}
使用void0来解决undefined被污染问题
undefined=1; !!undefined;//true !!void(0);//false
单行写一个评级组件
"★★★★★☆☆☆☆☆".slice(5-rate,10-rate);
JavaScript错误处理的方式的正确姿势
try{ something }catch(e){ window.location.href= "http://stackoverflow.com/search?q=[js]+"+ e.message; }
匿名函数自执行写法
(function(){}()); (function(){})(); [function(){}()]; ~function(){}(); !function(){}(); +function(){}(); -function(){}(); deletefunction(){}(); typeoffunction(){}(); voidfunction(){}(); newfunction(){}(); newfunction(){}; varf=function(){}(); 1,function(){}(); 1^function(){}(); 1>function(){}();
两个整数交换数值
vara=20,b=30; a^=b; b^=a; a^=b; a;//30 b;//20
数字字符转数字
vara='1'; +a;//1
最短的代码实现数组去重
[...newSet([1,"1",2,1,1,3])];//[1,"1",2,3]
用最短的代码实现一个长度为m(6)且值都n(8)的数组
Array(6).fill(8);//[8,8,8,8,8,8]
将argruments对象转换成数组
varargArray=Array.prototype.slice.call(arguments); //ES6: varargArray=Array.from(arguments) //or varargArray=[...arguments];
获取日期时间缀
//获取指定时间的时间缀 newDate().getTime(); (newDate()).getTime(); (newDate).getTime(); //获取当前的时间缀 Date.now(); //日期显示转换为数字 +newDate();
使用~x.indexOf('y')来简化x.indexOf('y')>-1
varstr='helloworld'; if(str.indexOf('lo')>-1){ //... } if(~str.indexOf('lo')){ //... }
两者的差别之处在于解析和转换两者之间的理解。
解析允许字符串中含有非数字字符,解析按从左到右的顺序,如果遇到非数字字符就停止。而转换不允许出现非数字字符,否者会失败并返回NaN。
vara='520'; varb='520px'; Number(a);//520 parseInt(a);//520 Number(b);//NaN parseInt(b);//520
parseInt方法第二个参数用于指定转换的基数,ES5默认为10进制。
parseInt('10',2);//2 parseInt('10',8);//8 parseInt('10',10);//10 parseInt('10',16);//16
对于网上parseInt(0.0000008)的结果为什么为8,原因在于0.0000008转换成字符为"8e-7",然后根据parseInt的解析规则自然得到"8"这个结果。
+拼接操作,+xorString(x)?
+运算符可用于数字加法,同时也可以用于字符串拼接。如果+的其中一个操作符是字符串(或者通过隐式强制转换可以得到字符串),则执行字符串拼接;否者执行数字加法。
需要注意的时对于数组而言,不能通过valueOf()方法得到简单基本类型值,于是转而调用toString()方法。
[1,2]+[3,4];//"1,23,4"
对于对象同样会先调用valueOf()方法,然后通过toString()方法返回对象的字符串表示。
vara={}; a+123;//"[objectObject]123"
对于a+""隐式转换和String(a)显示转换有一个细微的差别:a+''会对a调用valueOf()方法,而String()直接调用toString()方法。大多数情况下我们不会考虑这个问题,除非真遇到。
vara={ valueOf:function(){return42;}, toString:function(){return4;} } a+'';//42 String(a);//4
判断对象的实例
//方法一:ES3 functionPerson(name,age){ if(!(thisinstanceofPerson)){ returnnewPerson(name,age); } this.name=name; this.age=age; } //方法二:ES5 functionPerson(name,age){ varself=thisinstanceofPerson?this:Object.create(Person.prototype); self.name=name; self.age=age; returnself; } //方法三:ES6 functionPerson(name,age){ if(!new.target){ throw'Peronmustcalledwithnew'; } this.name=name; this.age=age; }
数据安全类型检查
//对象 functionisObject(value){ returnObject.prototype.toString.call(value).slice(8,-1)==='Object''; } //数组 functionisArray(value){ returnObject.prototype.toString.call(value).slice(8,-1)==='Array'; } //函数 functionisFunction(value){ returnObject.prototype.toString.call(value).slice(8,-1)==='Function'; }
让数字的字面值看起来像对象
toString();//UncaughtSyntaxError:Invalidorunexpectedtoken ..toString();//第二个点号可以正常解析 .toString();//注意点号前面的空格 (2).toString();//2先被计算
对象可计算属性名(仅在ES6中)
varsuffix='name'; varperson={ ['first'+suffix]:'Nicholas', ['last'+suffix]:'Zakas' } person['firstname'];//"Nicholas" person['lastname'];//"Zakas"
数字四舍五入
//v:值,p:精度 function(v,p){ p=Math.pow(10,p>>>31?0:p|0) v*=p; return(v+0.5+(v>>31)|0)/p } round(123.45353,2);//123.45
在浏览器中根据url下载文件
functiondownload(url){ varisChrome=navigator.userAgent.toLowerCase().indexOf('chrome')>-1; varisSafari=navigator.userAgent.toLowerCase().indexOf('safari')>-1; if(isChrome||isSafari){ varlink=document.createElement('a'); link.href=url; if(link.download!==undefined){ varfileName=url.substring(url.lastIndexOf('/')+1,url.length); link.download=fileName; } if(document.createEvent){ vare=document.createEvent('MouseEvents'); e.initEvent('click',true,true); link.dispatchEvent(e); returntrue; } } if(url.indexOf('?')===-1){ url+='?download'; } window.open(url,'_self'); returntrue; }
快速生成UUID
functionuuid(){ vard=newDate().getTime(); varuuid='xxxxxxxxxxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c){ varr=(d+Math.random()*16)%16|0; d=Math.floor(d/16); return(c=='x'?r:(r&0x3|0x8)).toString(16); }); returnuuid; }; uuid();//"33f7f26656cb-499b-b73e-89a921a59ba6"
JavaScript浮点数精度问题
functionisEqual(n1,n2,epsilon){ epsilon=epsilon==undefined?10:epsilon;//默认精度为10 returnn1.toFixed(epsilon)===n2.toFixed(epsilon); } 0.1+0.2;//0.30000000000000004 isEqual(0.1+0.2,0.3);//true 0.7+0.1+99.1+0.1;//99.99999999999999 isEqual(0.7+0.1+99.1+0.1,100);//true
格式化表单数据
functionformatParam(obj){ varquery='',name,value,fullSubName,subName,subValue,innerObj,i; for(nameinobj){ value=obj[name]; if(valueinstanceofArray){ for(i=0;i创建指定长度非空数组
在JavaScript中可以通过newArray(3)的形式创建一个长度为3的空数组。在老的Chrome中其值为[undefinedx3],在最新的Chrome中为[emptyx3],即空单元数组。在老Chrome中,相当于显示使用[undefined,undefined,undefined]的方式创建长度为3的数组。
但是,两者在调用map()方法的结果是明显不同的
vara=newArray(3); varb=[undefined,undefined,undefined]; a.map((v,i)=>i);//[empty×3] b.map((v,i)=>i);//[0,1,2]多数情况我们期望创建的是包含undefined值的指定长度的空数组,可以通过下面这种方法来达到目的:
vara=Array.apply(null,{length:3}); a;//[undefined,undefined,undefined] a.map((v,i)=>i);//[0,1,2]总之,尽量不要创建和使用空单元数组。
以上所述是小编给大家介绍的JavaScript有用的代码片段和trick,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。