常用,好用的js代码

记录看到或者用到的js代码,长期更新!

判断是否是正整数

number>>>0 === number-0

解析: number-0 转换成数字,再通过位移运算(>>>)判断是否跟原数字相等
补充,这个代码是有范围的,当数字> 999999999 的时候就不成立了
原理可以参考这篇文章, 传送门

安全检查javascript的类型


function typeOf(o){
	let _toString = Object.prototype.toString;
	//列举基本的数据类型和内置的对象类型
	let _types = {
		"undefined" : "undefined",
		"number" : "number",
		"string" : "string",
		"boolean" : "boolean",
		"[object Function]" : "function",
		"[object Array]" : "array",
		"[object Date]" : "date",
		"[object RegExp]" : "regExp",
		"[object Error]" : "error"
	}
	
	return _types[typeof o] || _types[_toString.call(o)] || (o? "object":"null");
	
}

ps: 上述方法适用于基本的数据类型和内置对象,而对于自定义对象是无效的。

判断是不是数组


function isArray(arr){
    return Object.prototype.toString.call(arr) === '[object Array]'
}

判断是不是ios系统

function isIOS(){
    let u = navigator.userAgent;
    let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
    return isIOS;
}

转成字符串

function toString (val) {
  return val == null
    ? ''
    : typeof val === 'object'
      ? JSON.stringify(val, null, 2)
      : String(val)
}

中划线转驼峰


function camelize(str){
    var reg = /([a-z]?)-([a-z])/g;
    var index = 0;
    return str.replace(reg,function(r,$1,$2){
        
        if($1){
            return $2?$1+$2.toUpperCase():'';
        }else{
            return $2;
        }
        
    })
}

驼峰转中划线


function camelize(str){
    return str.replace(/\B([A-Z])/g, '-$1').toLowerCase();
}

首字母大写


function capitalize(str){
    return str.charAt(0).toUpperCase() + str.slice(1);
}

获取url的query,返回指定key的值

function getUrlParam(sUrl, sKey) {
    var index = sUrl.indexOf('?');
    var urlStr = sUrl.substr(index+1);
    var reg = /&?([^=]+)=([^&#]+)/g;
    var result = {};
    urlStr.replace(reg,function(re,$1,$2){
        if(result[$1]){
            var item = result[$1];
            result[$1] = [].concat(item,$2);
        }else{
            result[$1] = $2;
        }
    });
    if(sKey){
        return result[sKey]||'';
    }else{
        return false
    }
}

快速对数据进行降维打击(多维->一维)


var arr = [[1],[2]];
var arr2 = Array.prototype.concat.apply([],arr); //划重点 ,这个只能是二维->一维
var arr3 = arr.flat(Infinity); //多维->一维

h5页面跳转小程序


var ua = navigator.userAgent.toLowerCase();
if(ua.match(/MicroMessenger/i)=="micromessenger"){
              wx.miniProgram.getEnv((res)=>{
                 if (res.miniprogram) {
                   // 如果在小程序环境中就跳转
                     wx.miniProgram.redirectTo({
                       url: '.......'
                     });
                     return;
                 }
              })
            }

判断是不是promise对象


function isPromise(val){
    return (
        val!==undefined&&
        val!== null &&
        typeof val.then === 'function' &&
        typeof val.catch === 'function'
    )
}

软绑定

不同于硬绑定,软绑定可以给默认绑定指定一个全局对象和undefined以外的值,那就可以实现和硬绑定相同的效果,同时保留隐式绑定或者显式绑定修改this的能力!


if(! Function.prototype.softBind){
        Function.prototype.softBind = function(obj){
            var fn = this;
            var curried = [].slice.call(arguments,1);
            var bound = function(){
                return fn.apply(
                    (!this || this === (window || global)) ?
                        obj : this,
                    curried.concat.apply(curried,arguments)
                );
            };
            bound.prototype = Object.create(fn.prototype);
            return bound;
        }
    }


判断一个字符串一定可以转成数字

function isNumberic(n){
    return !Number.isNaN(parseFloat(n)) && Number.isFinite(Number(n));
}

这代码比你想象中的要难理解许多

JSON序列化Error对象

如果对error对象直接用JSON.stringify(),直接打印"{}"; 那是因为error对象的属性是不可遍历的;可以用Object.getOwnPropertyNames()获取自身的属性

var error = new Error('this is a error message');
JSON.stringify(error,Object.getOwnPropertyNames(error));

格式化日期

输入一个date对象,并根据格式输出


function formatDate(date,format){
    var o = {
        'y+': date.getFullYear(),
        'M+': date.getMonth()+1,
        'd+': date.getDate(),
        'H+': date.getHours(),
        'h+': date.getHours()> 12? date.getHours()-12: date.getHours(),
        'm+': date.getMinutes(),
        's+': date.getSeconds(),
        'w': date.getDay()
    };

    var weekends =  ['日', '一', '二', '三', '四', '五', '六'];
    
    for(var k in o){
        if(new RegExp('('+k+')').test(format)){
            if(k=='y+'){
                format = format.replace(RegExp.$1, (o[k]+'').substr(4- RegExp.$1.length));
            }else if(k=='w'){
                format = format.replace(RegExp.$1,weekends[o[k]]);
            }else{
                format = format.replace(RegExp.$1, RegExp.$1.length==1? o[k]: ('00'+o[k]).substr((''+o[k]).length))
            }
        }
    }
    return format;
}

获取字符的真实长度

一般中文字符都是两个字节的


function getLength(s){
    var len = s.length;
    var reg = /[\u4e00-\u9fa5]/;
    for(var i=0;i<len;i++){
        if(reg.test(s.charAt(i))){
            len+=2;
        }else{
            len+=1;
        }
    }
    
    return len;
}

rgb 颜色字符串转换为十六进制

比如把rgb(255,255,255)转成#ffffff。 关键在于,可以用.toString(16)方法把数字转成十六进制


function reg2hex(sRGB){
    var reg = /rgb\((\d+),\s*(\d+),\s*(\d+)\)/;
    var rs = sRGB.match(reg);
    if(!rs){
        return sRGB;
    }else{
        var str = '#';
        for(var i=1;i<=3;i++){
            var n = parseInt(rs[i]);
            if(n<0 || n>255){return sRGB}
            str += n>16? n.toString(16): '0'+n.toString(16);
        }
        return str;
    }
}

十进制和二进制的转换


// 十进制转二进制
num.toString(2);

// 二进制转十进制
parseInt(num,2);

获取全局变量global(在不同的环境)


// self 是window的保留关键字, 在浏览器中指向window对象

var global = typeof window != 'undefined' && window.Math == Math
  ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();

posted @ 2018-12-08 20:59  =.=  阅读(1082)  评论(0编辑  收藏  举报