JavaScript常用工具方法封装

JavaScript

1. type 类型判断

创新互联是专业的洛浦网站建设公司,洛浦接单;提供网站设计、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行洛浦网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

 
 
 
  1. isString (o) { //是否字符串
  2.     return Object.prototype.toString.call(o).slice(8, -1) === 'String'
  3. isNumber (o) { //是否数字
  4.     return Object.prototype.toString.call(o).slice(8, -1) === 'Number'
  5. isBoolean (o) { //是否boolean
  6.     return Object.prototype.toString.call(o).slice(8, -1) === 'Boolean'
  7. isFunction (o) { //是否函数
  8.     return Object.prototype.toString.call(o).slice(8, -1) === 'Function'
  9. isNull (o) { //是否为null
  10.     return Object.prototype.toString.call(o).slice(8, -1) === 'Null'
  11. isUndefined (o) { //是否undefined
  12.     return Object.prototype.toString.call(o).slice(8, -1) === 'Undefined'
  13. isObj (o) { //是否对象
  14.     return Object.prototype.toString.call(o).slice(8, -1) === 'Object'
  15. isArray (o) { //是否数组
  16.     return Object.prototype.toString.call(o).slice(8, -1) === 'Array'
  17. isDate (o) { //是否时间
  18.     return Object.prototype.toString.call(o).slice(8, -1) === 'Date'
  19. isRegExp (o) { //是否正则
  20.     return Object.prototype.toString.call(o).slice(8, -1) === 'RegExp'
  21. isError (o) { //是否错误对象
  22.     return Object.prototype.toString.call(o).slice(8, -1) === 'Error'
  23. isSymbol (o) { //是否Symbol函数
  24.     return Object.prototype.toString.call(o).slice(8, -1) === 'Symbol'
  25. isPromise (o) { //是否Promise对象
  26.     return Object.prototype.toString.call(o).slice(8, -1) === 'Promise'
  27. isSet (o) { //是否Set对象
  28.     return Object.prototype.toString.call(o).slice(8, -1) === 'Set'
  29. isFalse (o) {
  30.     if (!o || o === 'null' || o === 'undefined' || o === 'false' || o === 'NaN') return true
  31.         return false
  32. isTrue (o) {
  33.     return !this.isFalse(o)
  34. isIos () {
  35.     var u = navigator.userAgent;
  36.     if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {//安卓手机
  37.         // return "Android";
  38.         return false
  39.     } else if (u.indexOf('iPhone') > -1) {//苹果手机
  40.         // return "iPhone";
  41.         return true
  42.     } else if (u.indexOf('iPad') > -1) {//iPad
  43.         // return "iPad";
  44.         return false
  45.     } else if (u.indexOf('Windows Phone') > -1) {//winphone手机
  46.         // return "Windows Phone";
  47.         return false
  48.     }else{
  49.         return false
  50.     }
  51. isPC () { //是否为PC端
  52.     var userAgentInfo = navigator.userAgent;
  53.     var Agents = ["Android", "iPhone",
  54.                 "SymbianOS", "Windows Phone",
  55.                 "iPad", "iPod"];
  56.     var flag = true;
  57.     for (var v = 0; v < Agents.length; v++) {
  58.         if (userAgentInfo.indexOf(Agents[v]) > 0) {
  59.             flag = false;
  60.             break;
  61.         }
  62.     }
  63.     return flag;
  64. browserType(){
  65.     var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
  66.     var isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器
  67.     var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; //判断是否IE浏览器
  68.     var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1;
  69.     var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判断是否IE的Edge浏览器  
  70.     var isFF = userAgent.indexOf("Firefox") > -1; //判断是否Firefox浏览器
  71.     var isSafari = userAgent.indexOf("Safari") > -1 && userAgent.indexOf("Chrome") == -1; //判断是否Safari浏览器
  72.     var isChrome = userAgent.indexOf("Chrome") > -1 && userAgent.indexOf("Safari") > -1; //判断Chrome浏览器
  73.     if (isIE) {
  74.         var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
  75.         reIE.test(userAgent);
  76.         var fIEVersion = parseFloat(RegExp["$1"]);
  77.         if(fIEVersion == 7) return "IE7"
  78.         else if(fIEVersion == 8) return "IE8";
  79.         else if(fIEVersion == 9) return "IE9";
  80.         else if(fIEVersion == 10) return "IE10";
  81.         else return "IE7以下"//IE版本过低
  82.     }
  83.     if (isIE11) return 'IE11';
  84.     if (isEdge) return "Edge";
  85.     if (isFF) return "FF";
  86.     if (isOpera) return "Opera";
  87.     if (isSafari) return "Safari";
  88.     if (isChrome) return "Chrome";
  89. checkStr (str, type) {
  90.     switch (type) {
  91.         case 'phone':   //手机号码
  92.             return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str);
  93.         case 'tel':     //座机
  94.             return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str);
  95.         case 'card':    //身份证
  96.             return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str);
  97.         case 'pwd':     //密码以字母开头,长度在6~18之间,只能包含字母、数字和下划线
  98.             return /^[a-zA-Z]\w{5,17}$/.test(str)
  99.         case 'postal':  //邮政编码
  100.             return /[1-9]\d{5}(?!\d)/.test(str);
  101.         case 'QQ':      //QQ号
  102.             return /^[1-9][0-9]{4,9}$/.test(str);
  103.         case 'email':   //邮箱
  104.             return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str);
  105.         case 'money':   //金额(小数点2位)
  106.             return /^\d*(?:\.\d{0,2})?$/.test(str);
  107.         case 'URL':     //网址
  108.             return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(str)
  109.         case 'IP':      //IP
  110.             return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str);
  111.         case 'date':    //日期时间
  112.             return /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
  113.         case 'number':  //数字
  114.             return /^[0-9]$/.test(str);
  115.         case 'english': //英文
  116.             return /^[a-zA-Z]+$/.test(str);
  117.         case 'chinese': //中文
  118.             return /^[\u4E00-\u9FA5]+$/.test(str);
  119.         case 'lower':   //小写
  120.             return /^[a-z]+$/.test(str);
  121.         case 'upper':   //大写
  122.             return /^[A-Z]+$/.test(str);
  123.         case 'HTML':    //HTML标记
  124.             return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str);
  125.         default:
  126.             return true;
  127.     }
  128.     // 严格的身份证校验
  129.     isCardID(sId) {
  130.         if (!/(^\d{15}$)|(^\d{17}(\d|X|x)$)/.test(sId)) {
  131.             alert('你输入的身份证长度或格式错误')
  132.             return false
  133.         }
  134.         //身份证城市
  135.         var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"};
  136.         if(!aCity[parseInt(sId.substr(0,2))]) { 
  137.             alert('你的身份证地区非法')
  138.             return false
  139.         }
  140.         // 出生日期验证
  141.         var sBirthday=(sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2))).replace(/-/g,"/"),
  142.             d = new Date(sBirthday)
  143.         if(sBirthday != (d.getFullYear()+"/"+ (d.getMonth()+1) + "/" + d.getDate())) {
  144.             alert('身份证上的出生日期非法')
  145.             return false
  146.         }
  147.         // 身份证号码校验
  148.         var sum = 0,
  149.             weights =  [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2],
  150.             codes = "10X98765432"
  151.         for (var i = 0; i < sId.length - 1; i++) {
  152.             sum += sId[i] * weights[i];
  153.         }
  154.         var last = codes[sum % 11]; //计算出来的最后一位身份证号码
  155.         if (sId[sId.length-1] != last) { 
  156.             alert('你输入的身份证号非法')
  157.             return false
  158.         }
  159.         return true
  160.     }
  161. }

 2. Date

 
 
 
  1. /**
  2.  * 格式化时间
  3.  * 
  4.  * @param  {time} 时间
  5.  * @param  {cFormat} 格式
  6.  * @return {String} 字符串
  7.  *
  8.  * @example formatTime('2018-1-29', '{y}/{m}/{d} {h}:{i}:{s}') // -> 2018/01/29 00:00:00
  9.  */
  10. formatTime(time, cFormat) {
  11.     if (arguments.length === 0) return null
  12.     if ((time + '').length === 10) {
  13.         time = +time * 1000
  14.     }
  15.     var format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}', date
  16.     if (typeof time === 'object') {
  17.         date = time
  18.     } else {
  19.         date = new Date(time)
  20.     }
  21.     var formatObj = {
  22.         y: date.getFullYear(),
  23.         m: date.getMonth() + 1,
  24.         d: date.getDate(),
  25.         h: date.getHours(),
  26.         i: date.getMinutes(),
  27.         s: date.getSeconds(),
  28.         a: date.getDay()
  29.     }
  30.     var time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
  31.         var value = formatObj[key]
  32.         if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
  33.         if (result.length > 0 && value < 10) {
  34.             value = '0' + value
  35.         }
  36.         return value || 0
  37.     })
  38.     return time_str
  39. }
  40. /**
  41.  * 返回指定长度的月份集合
  42.  * 
  43.  * @param  {time} 时间
  44.  * @param  {len} 长度
  45.  * @param  {direction} 方向:  1: 前几个月;  2: 后几个月;  3:前后几个月  默认 3
  46.  * @return {Array} 数组
  47.  * 
  48.  * @example   getMonths('2018-1-29', 6, 1)  // ->  ["2018-1", "2017-12", "2017-11", "2017-10", "2017-9", "2017-8", "2017-7"]
  49.  */
  50. getMonths(time, len, direction) {
  51.     var mm = new Date(time).getMonth(),
  52.         yy = new Date(time).getFullYear(),
  53.         direction = isNaN(direction) ? 3 : direction,
  54.         index = mm;
  55.     var cutMonth = function(index) {
  56.         if ( index <= len && index >= -len) {
  57.             return direction === 1 ? formatPre(index).concat(cutMonth(++index)):
  58.                 direction === 2 ? formatNext(index).concat(cutMonth(++index)):formatCurr(index).concat(cutMonth(++index))
  59.         }
  60.         return []
  61.     }
  62.     var formatNext = function(i) {
  63.         var y = Math.floor(i/12),
  64.             m = i%12
  65.         return [yy+y + '-' + (m+1)]
  66.     }
  67.     var formatPre = function(i) {
  68.         var y = Math.ceil(i/12),
  69.             m = i%12
  70.         m = m===0 ? 12 : m
  71.         return [yy-y + '-' + (13 - m)]
  72.     }
  73.     var formatCurr = function(i) {
  74.         var y = Math.floor(i/12),
  75.             yNext = Math.ceil(i/12),
  76.             m = i%12,
  77.             mNext = m===0 ? 12 : m
  78.         return [yy-yNext + '-' + (13 - mNext),yy+y + '-' + (m+1)]
  79.     }
  80.     // 数组去重
  81.     var unique = function(arr) {
  82.         if ( Array.hasOwnProperty('from') ) {
  83.             return Array.from(new Set(arr));
  84.         }else{
  85.             var n = {},r=[]; 
  86.             for(var i = 0; i < arr.length; i++){
  87.                 if (!n[arr[i]]){
  88.                     n[arr[i]] = true; 
  89.                     r.push(arr[i]);
  90.                 }
  91.             }
  92.             return r;
  93.         }
  94.     }
  95.     return direction !== 3 ? cutMonth(index) : unique(cutMonth(index).sort(function(t1, t2){
  96.         return new Date(t1).getTime() - new Date(t2).getTime()
  97.     }))
  98. }
  99. /**
  100.  * 返回指定长度的天数集合
  101.  * 
  102.  * @param  {time} 时间
  103.  * @param  {len} 长度
  104.  * @param  {direction} 方向: 1: 前几天;  2: 后几天;  3:前后几天  默认 3
  105.  * @return {Array} 数组
  106.  *
  107.  * @example date.getDays('2018-1-29', 6) // -> ["2018-1-26", "2018-1-27", "2018-1-28", "2018-1-29", "2018-1-30", "2018-1-31", "2018-2-1"]
  108.  */
  109. getDays(time, len, diretion) {
  110.     var tt = new Date(time)
  111.     var getDay = function(day) {
  112.         var t = new Date(time)
  113.         t.setDate(t.getDate() + day)
  114.         var m = t.getMonth()+1
  115.         return t.getFullYear()+'-'+m+'-'+t.getDate()
  116.     }
  117.     var arr = []
  118.     if (diretion === 1) {
  119.         for (var i = 1; i <= len; i++) {
  120.             arr.unshift(getDay(-i))
  121.         }
  122.     }else if(diretion === 2) {
  123.         for (var i = 1; i <= len; i++) {
  124.             arr.push(getDay(i))
  125.         }
  126.     }else {
  127.         for (var i = 1; i <= len; i++) {
  128.             arr.unshift(getDay(-i))
  129.         }
  130.         arr.push(tt.getFullYear()+'-'+(tt.getMonth()+1)+'-'+tt.getDate())
  131.         for (var i = 1; i <= len; i++) {
  132.             arr.push(getDay(i))
  133.         }
  134.     }
  135.     return diretion === 1 ? arr.concat([tt.getFullYear()+'-'+(tt.getMonth()+1)+'-'+tt.getDate()]) : 
  136.         diretion === 2 ? [tt.getFullYear()+'-'+(tt.getMonth()+1)+'-'+tt.getDate()].concat(arr) : arr
  137. }
  138. /**
  139.  * @param  {s} 秒数
  140.  * @return {String} 字符串 
  141.  *
  142.  * @example formatHMS(3610) // -> 1h0m10s
  143.  */
  144. formatHMS (s) {
  145.     var str = ''
  146.     if (s > 3600) {
  147.         str = Math.floor(s/3600)+'h'+Math.floor(s%3600/60)+'m'+s%60+'s'
  148.     }else if(s > 60) {
  149.         str = Math.floor(s/60)+'m'+s%60+'s'
  150.     }else{
  151.         str = s%60+'s'
  152.     }
  153.     return str
  154. }
  155. /*获取某月有多少天*/
  156. getMonthOfDay (time) {
  157.     var date = new Date(time)
  158.     var year = date.getFullYear()
  159.     var mouth = date.getMonth() + 1
  160.     var days
  161.     //当月份为二月时,根据闰年还是非闰年判断天数
  162.     if (mouth == 2) {
  163.         days = (year%4==0 && year%100==0 && year%400==0) || (year%4==0 && year%100!=0) ? 28 : 29
  164.     } else if (mouth == 1 || mouth == 3 || mouth == 5 || mouth == 7 || mouth == 8 || mouth == 10 || mouth == 12) {
  165.         //月份为:1,3,5,7,8,10,12 时,为大月.则天数为31;
  166.         days = 31
  167.     } else {
  168.         //其他月份,天数为:30.
  169.         days = 30
  170.     }
  171.     return days
  172. }
  173. /*获取某年有多少天*/
  174. getYearOfDay (time) {
  175.     var firstDayYear = this.getFirstDayOfYear(time);
  176.     var lastDayYear = this.getLastDayOfYear(time);
  177.     var numSecond = (new Date(lastDayYear).getTime() - new Date(firstDayYear).getTime())/1000;
  178.     return Math.ceil(numSecond/(24*3600));
  179. }
  180. /*获取某年的第一天*/
  181. getFirstDayOfYear (time) {
  182.     var year = new Date(time).getFullYear();
  183.     return year + "-01-01 00:00:00";
  184. }
  185. /*获取某年最后一天*/
  186. getLastDayOfYear (time) {
  187.     var year = new Date(time).getFullYear();
  188.     var dateString = year + "-12-01 00:00:00";
  189.     var endDay = this.getMonthOfDay(dateString);
  190.     return year + "-12-" + endDay + " 23:59:59";
  191. }
  192. /*获取某个日期是当年中的第几天*/
  193. getDayOfYear (time) {
  194.     var firstDayYear = this.getFirstDayOfYear(time);
  195.     var numSecond = (new Date(time).getTime() - new Date(firstDayYear).getTime())/1000;
  196.     return Math.ceil(numSecond/(24*3600));
  197. }
  198. /*获取某个日期在这一年的第几周*/
  199. getDayOfYearWeek (time) {
  200.     var numdays = this.getDayOfYear(time);
  201.     return Math.ceil(numdays / 7);

3. Array

 
 
 
  1. /*判断一个元素是否在数组中*/
  2. contains (arr, val) {
  3.     return arr.indexOf(val) != -1 ? true : false;
  4. }
  5. /**
  6.  * @param  {arr} 数组
  7.  * @param  {fn} 回调函数
  8.  * @return {undefined}
  9.  */
  10. each (arr, fn) {
  11.     fn = fn || Function;
  12.     var a = [];
  13.     var args = Array.prototype.slice.call(arguments, 1);
  14.     for(var i = 0; i < arr.length; i++) {
  15.         var res = fn.apply(arr, [arr[i], i].concat(args));
  16.         if(res != null) a.push(res);
  17.     }
  18. }
  19. /**
  20.  * @param  {arr} 数组
  21.  * @param  {fn} 回调函数
  22.  * @param  {thisObj} this指向
  23.  * @return {Array} 
  24.  */
  25. map (arr, fn, thisObj) {
  26.     var scope = thisObj || window;
  27.     var a = [];
  28.     for(var i = 0, j = arr.length; i < j; ++i) {
  29.         var res = fn.call(scope, arr[i], i, this);
  30.         if(res != null) a.push(res);
  31.     }
  32.     return a;
  33. }
  34. /**
  35.  * @param  {arr} 数组
  36.  * @param  {type} 1:从小到大   2:从大到小   3:随机
  37.  * @return {Array}
  38.  */
  39. sort (arr, type = 1) {
  40.     return arr.sort( (a, b) => {
  41.         switch(type) {
  42.             case 1:
  43.                 return a - b;
  44.             case 2:
  45.                 return b - a;
  46.             case 3:
  47.                 return Math.random() - 0.5;
  48.             default:
  49.                 return arr;
  50.         }
  51.     })
  52. }
  53. /*去重*/
  54. unique (arr) {
  55.     if ( Array.hasOwnProperty('from') ) {
  56.         return Array.from(new Set(arr));
  57.     }else{
  58.         var n = {},r=[]; 
  59.         for(var i = 0; i < arr.length; i++){
  60.             if (!n[arr[i]]){
  61.                 n[arr[i]] = true; 
  62.                 r.push(arr[i]);
  63.             }
  64.         }
  65.         return r;
  66.     }
  67.     // 注:上面 else 里面的排重并不能区分 2 和 '2',但能减少用indexOf带来的性能,暂时没找到替代的方法。。。
  68.     /* 正确排重
  69.     if ( Array.hasOwnProperty('from') ) {
  70.         return Array.from(new Set(arr))
  71.     }else{
  72.         var r = [], NaNBol = true
  73.         for(var i=0; i < arr.length; i++) {
  74.             if (arr[i] !== arr[i]) {
  75.                 if (NaNBol && r.indexOf(arr[i]) === -1) {
  76.                     r.push(arr[i])
  77.                     NaNBol = false
  78.          

    分享名称:JavaScript常用工具方法封装
    本文网址:http://www.gawzjz.com/qtweb/news7/160157.html

    网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

    广告

    声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联