浮点数取整 1 2 3 4 5 const x = 123.4545 ;x >> 0 ; ~~x; x | 0 ; Math .floor (x);
注意:前三种方法只适用于32个位整数,对于负数的处理上 和Math.floor是不同的。
1 2 Math .floor (-12.53 ); -12.53 | 0 ;
生成6位数字验证码 1 2 3 4 5 6 7 8 9 10 11 ('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进制颜色代码生成 1 2 3 4 (function ( ) { return '#' +('00000' + (Math .random ()*0x1000000 <<0 ).toString (16 )).slice (-6 ); })();
驼峰命名转下划线 1 'componentMapModelRegistry' .match (/^[a-z][a-z0-9]+|[A-Z][a-z0-9]*/g ).join ('_' ).toLowerCase ();
url查询参数转json格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 const query = (search = '' ) => ((querystring = '' ) => (q => (querystring.split ('&' ).forEach (item => (kv => kv[0 ] && (q[kv[0 ]] = kv[1 ]))(item.split ('=' ))), q))({}))(search.split ('?' )[1 ]);var query = function (search ) { if (search === void 0 ) { search = '' ; } return (function (querystring ) { if (querystring === void 0 ) { querystring = '' ; } return (function (q ) { return (querystring.split ('&' ).forEach (function (item ) { return (function (kv ) { return kv[0 ] && (q[kv[0 ]] = kv[1 ]); })(item.split ('=' )); }), q); })({}); })(search.split ('?' )[1 ]); }; query ('?key1=value1&key2=value2' );
获取URL参数 1 2 3 4 5 6 7 8 function getQueryString (key ){ var reg = new RegExp ("(^|&)" + key +"=([^&]*)(&|$)" ); var r = window .location .search .substr (1 ).match (reg); if (r!=null ){ return unescape (r[2 ]); } return null ; }
n维数组展开成一维数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 var foo = [1 , [2 , 3 ], ['4' , 5 , ['6' ,7 ,[8 ]]], [9 ], 10 ];foo.toString ().split (',' ); eval ('[' + foo + ']' ); [1 , ...[2 , 3 ], ...['4' , 5 , ...['6' ,7 ,...[8 ]]], ...[9 ], 10 ]; JSON .parse (`[${JSON .stringify(foo).replace(/\[|]/g, '' )} ]` ); const flatten = (ary ) => ary.reduce ((a, b ) => a.concat (Array .isArray (b) ? flatten (b) : b), []);flatten (foo); function flatten (a ) { return Array .isArray (a) ? [].concat (...a.map (flatten)) : a; } flatten (foo);
注:更多方法请参考 《How to flatten nested array in JavaScript?》
日期格式化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 function format1 (x, y ) { var z = { y : x.getFullYear (), M : x.getMonth () + 1 , d : x.getDate (), h : x.getHours (), m : x.getMinutes (), s : x.getSeconds () }; return y.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 (new Date (), 'yy-M-d h:m:s' ); Date .prototype .format = function (fmt ) { var o = { "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 (var k in o){ if (new RegExp ("(" + k + ")" ).test (fmt)){ fmt = fmt.replace (RegExp .$1 , (RegExp .$1 .length == 1 ) ? (o[k]) : (("00" + o[k]).substr (("" + o[k]).length ))); } } return fmt; } new Date ().format ('yy-M-d h:m:s' );
统计文字个数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 function wordCount (data ) { var pattern = /[a-zA-Z0-9_\u0392-\u03c9]+|[\u4E00-\u9FFF\u3400-\u4dbf\uf900-\ufaff\u3040-\u309f\uac00-\ud7af]+/g ; var m = data.match (pattern); var count = 0 ; if ( m === null ) return count; for (var i = 0 ; i < m.length ; i++) { if (m[i].charCodeAt (0 ) >= 0x4E00 ) { count += m[i].length ; } else { count += 1 ; } } return count; } var text = '贷款买房,也意味着你能给自己的资产加杠杆,能够撬动更多的钱,来孳生更多的财务性收入。' ;wordCount (text);
特殊字符转义 1 2 3 4 5 6 function htmlspecialchars (str) { var str = str.toString ().replace (/&/g , "&" ).replace (/</g , "<" ).replace (/>/g , ">" ).replace (/"/g , '"' ); return str; } htmlspecialchars ('&jfkds<>' );
动态插入js 1 2 3 4 5 6 7 8 9 function injectScript (src ) { var s, 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); }
格式化数量 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function formatNum (num, n) { if (typeof num == "number" ) { num = String (num.toFixed (n || 0 )); var re = /(-?\d+)(\d{3})/ ; while (re.test (num)) num = num.replace (re, "$1,$2" ); return num; } return num; } formatNum (2313123 , 3 ); '2313123' .replace (/\B(?=(\d{3})+(?!\d))/g , ',' ); function formatNum (str ) { return str.split ('' ).reverse ().reduce ((prev, next, index ) => { return ((index % 3 ) ? next : (next + ',' )) + prev }); } formatNum ('2313323' );
身份证验证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 function chechCHNCardId (sNo ) { if (!this .regExpTest (sNo, /^[0-9]{17}[X0-9]$/ )) { return false ; } sNo = sNo.toString (); var a, 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) { case 0 : if (c != 1 ) { return false ; } break ; case 1 : if (c != 0 ) { return false ; } break ; case 2 : if (c != "X" ) { return false ; } break ; case 3 : if (c != 9 ) { return false ; } break ; case 4 : if (c != 8 ) { return false ; } break ; case 5 : if (c != 7 ) { return false ; } break ; case 6 : if (c != 6 ) { return false ; } break ; case 7 : if (c != 5 ) { return false ; } break ; case 8 : if (c != 4 ) { return false ; } break ; case 9 : if (c != 3 ) { return false ; } break ; case 10 : if (c != 2 ) { return false ; }; } return true ; }
测试质数 1 2 3 function isPrime (n ) { return !(/^.?$|^(..+?)\1+$/ ).test ('1' .repeat (n)) }
统计字符串中相同字符出现的次数 1 2 3 4 5 6 7 var arr = 'abcdaabc' ;var info = arr .split ('' ) .reduce ((p, k ) => (p[k]++ || (p[k] = 1 ), p), {}); console .log (info);
使用void 0
来解决undefined
被污染问题 1 2 3 undefined = 1 ;!!undefined ; !!void (0 );
单行写一个评级组件 1 "★★★★★☆☆☆☆☆" .slice (5 - rate, 10 - rate);
JavaScript 错误处理的方式的正确姿势 1 2 3 4 5 6 7 try { something } catch (e) { window .location .href = "http://stackoverflow.com/search?q=[js]+" + e.message ; }
匿名函数自执行写法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ( function ( ) {}() ); ( function ( ) {} )(); [ function ( ) {}() ]; ~ function ( ) {}(); ! function ( ) {}(); + function ( ) {}(); - function ( ) {}(); delete function ( ) {}();typeof function ( ) {}();void function ( ) {}();new function ( ) {}();new function ( ) {};var f = function ( ) {}();1 , function ( ) {}();1 ^ function ( ) {}();1 > function ( ) {}();
两个整数交换数值 1 2 3 4 5 6 7 var a = 20 , b = 30 ;a ^= b; b ^= a; a ^= b; a; b;
数字字符转数字
最短的代码实现数组去重 1 [...new Set ([1 , "1" , 2 , 1 , 1 , 3 ])];
用最短的代码实现一个长度为m(6)且值都n(8)的数组
将argruments对象转换成数组 1 2 3 4 5 6 7 var argArray = Array .prototype .slice .call (arguments );var argArray = Array .from (arguments )var argArray = [...arguments ];
获取日期时间缀 1 2 3 4 5 6 7 8 new Date ().getTime ();(new Date ()).getTime (); (new Date ).getTime (); Date .now ();+new Date ();
使用~x.indexOf('y')
来简化x.indexOf('y') > -1
1 2 3 4 5 6 7 8 var str = 'hello world' ;if (str.indexOf ('lo' ) > -1 ) { } if (~str.indexOf ('lo' )) { }
parseInt()
or Number()
两者的差别之处在于解析 和转换 两者之间的理解。
解析允许 字符串中含有非数字字符,解析按从左到右的顺序,如果遇到非数字字符就停止。而转换不允许 出现非数字字符,否者会失败并返回NaN 。
1 2 3 4 5 6 7 8 var a = '520' ;var b = '520px' ;Number (a); parseInt (a); Number (b); parseInt (b);
parseInt
方法第二个参数用于指定转换的基数,ES5默认为10进制。
1 2 3 4 parseInt ('10' , 2 ); parseInt ('10' , 8 ); parseInt ('10' , 10 ); parseInt ('10' , 16 );
对于网上parseInt(0.0000008)
的结果为什么为8,原因在于0.0000008转换成字符为”8e-7”,然后根据parseInt
的解析规则自然得到”8”这个结果。
+
拼接操作,+x
or String(x)
?+运算符可用于数字加法,同时也可以用于字符串拼接。如果+的其中一个操作符是字符串(或者通过 隐式强制转换可以得到字符串),则执行字符串拼接;否者执行数字加法。
需要注意的时对于数组而言,不能通过valueOf()
方法得到简单基本类型值,于是转而调用toString()
方法。
对于对象同样会先调用valueOf()
方法,然后通过toString()
方法返回对象的字符串表示。
对于a + ""
隐式转换和String(a)
显示转换有一个细微的差别:a + ''
会对a调用valueOf()
方法,而String()
直接调用toString()
方法。大多数情况下我们不会考虑这个问题,除非真遇到。
1 对于a + "" 隐式转换和String (a)显示转换有一个细微的差别:a + '' 会对a调用valueOf ()方法,而String ()直接调用toString ()方法。大多数情况下我们不会考虑这个问题,除非真遇到。
判断对象的实例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 function Person (name, age ) { if (!(this instanceof Person )) { return new Person (name, age); } this .name = name; this .age = age; } function Person (name, age ) { var self = this instanceof Person ? this : Object .create (Person .prototype ); self.name = name; self.age = age; return self; } function Person (name, age ) { if (!new .target ) { throw 'Peron must called with new' ; } this .name = name; this .age = age; }
数据安全类型检查 1 2 3 4 5 6 7 8 9 10 11 12 13 14 function isObject (value ) { return Object .prototype .toString .call (value).slice (8 , -1 ) === 'Object' ; } function isArray (value ) { return Object .prototype .toString .call (value).slice (8 , -1 ) === 'Array' ; } function isFunction (value ) { return Object .prototype .toString .call (value).slice (8 , -1 ) === 'Function' ; }
让数字的字面值看起来像对象 1 2 3 4 5 2. toString (); 2. .toString (); 2 .toString (); (2 ).toString ();
对象可计算属性名(仅在ES6中) 1 2 3 4 5 6 7 8 var suffix = ' name' ;var person = { ['first' + suffix]: 'Nicholas' , ['last' + suffix]: 'Zakas' } person['first name' ]; person['last name' ];
数字四舍五入 1 2 3 4 5 6 7 8 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 );
在浏览器中根据url下载文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 function download (url ) { var isChrome = navigator.userAgent .toLowerCase ().indexOf ('chrome' ) > -1 ; var isSafari = navigator.userAgent .toLowerCase ().indexOf ('safari' ) > -1 ; if (isChrome || isSafari) { var link = document .createElement ('a' ); link.href = url; if (link.download !== undefined ) { var fileName = url.substring (url.lastIndexOf ('/' ) + 1 , url.length ); link.download = fileName; } if (document .createEvent ) { var e = document .createEvent ('MouseEvents' ); e.initEvent ('click' , true , true ); link.dispatchEvent (e); return true ; } } if (url.indexOf ('?' ) === -1 ) { url += '?download' ; } window .open (url, '_self' ); return true ; }
快速生成UUID 1 2 3 4 5 6 7 8 9 10 11 function uuid ( ) { var d = new Date ().getTime (); var uuid = 'xxxxxxxxxxxx-4xxx-yxxx-xxxxxxxxxxxx' .replace (/[xy]/g , function (c ) { var r = (d + Math .random () * 16 ) % 16 | 0 ; d = Math .floor (d / 16 ); return (c == 'x' ? r : (r & 0x3 | 0x8 )).toString (16 ); }); return uuid; }; uuid ();
JavaScript浮点数精度问题 1 2 3 4 5 6 7 8 9 10 function isEqual (n1, n2, epsilon ) { epsilon = epsilon == undefined ? 10 : epsilon; return n1.toFixed (epsilon) === n2.toFixed (epsilon); } 0.1 + 0.2 ; isEqual (0.1 + 0.2 , 0.3 ); 0.7 + 0.1 + 99.1 + 0.1 ; isEqual (0.7 + 0.1 + 99.1 + 0.1 , 100 );
格式化表单数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 function formatParam (obj ) { var query = '' , name, value, fullSubName, subName, subValue, innerObj, i; for (name in obj) { value = obj[name]; if (value instanceof Array ) { for (i=0 ; i<value.length ; ++i) { subValue = value[i]; fullSubName = name + '[' + i + ']' ; innerObj = {}; innerObj[fullSubName] = subValue; query += formatParam (innerObj) + '&' ; } } else if (value instanceof Object ) { for (subName in value) { subValue = value[subName]; fullSubName = name + '[' + subName + ']' ; innerObj = {}; innerObj[fullSubName] = subValue; query += formatParam (innerObj) + '&' ; } } else if (value !== undefined && value !== null ) query += encodeURIComponent (name) + '=' + encodeURIComponent (value) + '&' ; } return query.length ? query.substr (0 , query.length - 1 ) : query; } var param = { name : 'jenemy' , likes : [0 , 1 , 3 ], memberCard : [ { title : '1' , id : 1 }, { title : '2' , id : 2 } ] } formatParam (param);
创建指定长度非空数组 在JavaScript中可以通过new Array(3)
的形式创建一个长度为3的空数组。在老的Chrome中其值为[undefined x 3]
,在最新的Chrome中为[empty x 3]
,即空单元数组。在老Chrome中,相当于显示使用[undefined, undefined, undefined]
的方式创建长度为3的数组。
但是,两者在调用map()方法的结果是明显不同的
1 2 3 4 5 var a = new Array (3 );var b = [undefined , undefined , undefined ];a.map ((v, i ) => i); b.map ((v, i ) => i);
多数情况我们期望创建的是包含undefined值的指定长度的空数组,可以通过下面这种方法来达到目的:
1 2 3 4 var a = Array .apply (null , { length : 3 });a; a.map ((v, i ) => i);
总之,尽量不要创建和使用空单元数组。
判断客户端 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var browser = { v : (function ( ) { var u = navigator.userAgent , app = navigator.appVersion , p = navigator.platform ; return { trident : u.indexOf ('Trident' ) > -1 , presto : u.indexOf ('Presto' ) > -1 , webKit : u.indexOf ('AppleWebKit' ) > -1 , gecko : u.indexOf ('Gecko' ) > -1 && u.indexOf ('KHTML' ) == -1 , mobile : !!u.match (/AppleWebKit.*Mobile.*/ ), ios : !!u.match (/i[^;]+;( U;)? CPU.+Mac OS X/ ), android : u.indexOf ('Android' ) > -1 || u.indexOf ('Linux' ) > -1 , iPhone : u.indexOf ('iPhone' ) > -1 , iPad : u.indexOf ('iPad' ) > -1 , weixin : u.indexOf ('MicroMessenger' ) > -1 , webApp : u.indexOf ('Safari' ) == -1 , UCB : u.match (/UCBrowser/i ) == "UCBrowser" , QQB : u.match (/MQQBrowser/i ) == "MQQBrowser" , win : p.indexOf ('Win' ) > -1 , mac : p.indexOf ('Mac' ) > -1 }; })() }