js常用的一些工具类方法

1,获取浏览器地址栏参数

function GetUrlParam(name) {
  var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
  var r = window.location.search.substr(1).match(reg);
  if (r != null) return unescape(r[2]); return null;
}

2,地址栏上使用unicode加密解密,这样做主要是为了防止参数丢失

// 加密方法
function compileStr(code) {
  var c = String.fromCharCode(code.charCodeAt(0) + code.length);
  for (var i = 1; i < code.length; i++) {
    c += String.fromCharCode(code.charCodeAt(i) + code.charCodeAt(i - 1));
  }
  return escape(c);
}

// 解密方法
function uncompileStr(code) {
  code = unescape(code);
  var c = String.fromCharCode(code.charCodeAt(0) - code.length);
  for (var i = 1; i < code.length; i++) {
    c += String.fromCharCode(code.charCodeAt(i) - c.charCodeAt(i - 1));
  }
  return c;
}

3,对象克隆。解决对象是引用类型的问题。

function clone(obj){
    let temp = null;
    if(obj instanceof Array){
        temp = obj.concat();
    }else if(obj instanceof Function){
        //函数是共享的是无所谓的,js也没有什么办法可以在定义后再修改函数内容
        temp = obj;
    }else{
        temp = new Object();
        for(let item in obj){
            let val = obj[item];
            temp[item] = typeof val == 'object'?clone(val):val; //这里也没有判断是否为函数,因为对于函数,我们将它和一般值一样处理
        }
    }
    return temp;
}
var newObj = Object.assign({}, obj); // es6的新方法
var newObj = JSON.parse(JSON.stringify(obj));  // 这种方法也能切断对象引用,但是有个缺点:不能克隆函数进来。

 

4,day.js 处理日期 并根据法定节假日往后推演。

// 计算日期的方法
        captureDay(enter) {
            var holidayList = ['2019-09-13', '2019-09-14', '2019-09-14', '2019-10-01','2019-10-02','2019-10-03','2019-10-04'],
                planTime,   // 计划上线时间
                dayNum,     // 归档时间距离上线时间的天数
                weekNum = this.$dayjs(enter).format('d')*1 || 7; // 这一天是周几 周日为0
            if (weekNum < 4) {
                dayNum = 7 - weekNum + 2;
            } else {
                dayNum = 7 - weekNum + 4;
            }
            planTime = this.$dayjs(enter).add(dayNum, 'day').format('YYYY-MM-DD');   // 计算出了初次上线时间
            var expDayA = this.holidayFile(planTime),    // 上线时间往后推演几次,最多往后推演4次
                expDayB = this.holidayFile(expDayA),
                expDayC = this.holidayFile(expDayB),
                expDayD = this.holidayFile(expDayC),
                expDayE = this.holidayFile(expDayD),
                expDayArr = [planTime, expDayA, expDayB, expDayC, expDayD, expDayE];
            for (var val of expDayArr) {
                if(holidayList.indexOf(val) == -1) {
                    planTime = val;
                    break;
                }
            }
            return planTime;
        },
        // 上线时间往后推算
        holidayFile(ent) {
            var weekNum = this.$dayjs(ent).format('d')*1;
            if (weekNum == 2) {
                return this.$dayjs(ent).add(2, 'day').format('YYYY-MM-DD');
            } else {
                return this.$dayjs(ent).add(5, 'day').format('YYYY-MM-DD');
            }
        },

5,将对象属性转化成字典序(常用于加密)

// 将对象属性转为字典序
let ObjKeySort = function (obj) {
  let newkey = Object.keys(obj).sort(); //先用Object内置类的keys方法获取要排序对象的属性名,再利用Array原型上的sort方法对获取的属性名进行排序,newkey是一个数组
  let newObj = {};//创建一个新的对象,用于存放排好序的键值对
  for (let i = 0; i < newkey.length; i++) {//遍历newkey数组
    newObj[newkey[i]] = obj[newkey[i]];//向新创建的对象中按照排好的顺序依次增加键值对
  }
  return newObj;//返回排好序的新对象
}

6,将对象拼接成&连接的字符串

// 拼接属性参数
let ConnectStr = function (obj, token) {
  let str = '';
  for(let prop in obj){
    str += prop + '=' + obj[prop] + '&';
  }
  if (token) {
    str += 'access_token='+token;
  } else {
    str = str.substr(0, str.length-1);
  }
  return str;
}

7,将时间转化成yyyy-mm-dd hh-mm-ss.不传时间戳取当前时间

let FormatDateTime = function(inputTime) {
  if (inputTime) {
    var date = new Date(inputTime);
  } else {
    var date = new Date();
  }
  var y = date.getFullYear(); 
  var m = date.getMonth() + 1; 
  m = m < 10 ? ('0' + m) : m; 
  var d = date.getDate(); 
  d = d < 10 ? ('0' + d) : d; 
  var h = date.getHours();
  h = h < 10 ? ('0' + h) : h;
  var minute = date.getMinutes();
  var second = date.getSeconds();
  minute = minute < 10 ? ('0' + minute) : minute; 
  second = second < 10 ? ('0' + second) : second; 
  return y + '-' + m + '-' + d+' '+h+':'+minute+':'+second; 
};

8,js运算

    
    /*A乘B*/
	//调用:accMul(arg1,arg2) 返回值:arg1乘以arg2的精确结果
	function accMul(arg1,arg2){
		var m=0,s1=arg1.toString(),s2=arg2.toString();
		try{m+=s1.split(".")[1].length}catch(e){}
		try{m+=s2.split(".")[1].length}catch(e){}
		return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
	}
/*A除B*/
    function accDiv(arg1, arg2) {
			var t1 = 0, t2 = 0, r1, r2;
			try {
					t1 = arg1.toString().split(".")[1].length;
			}
			catch (e) {
			}
			try {
					t2 = arg2.toString().split(".")[1].length;
			}
			catch (e) {
			}
			with (Math) {
					r1 = Number(arg1.toString().replace(".", ""));
					r2 = Number(arg2.toString().replace(".", ""));
					return (r1 / r2) * pow(10, t2 - t1);
			}
	}
// 精度计算加法
    function dcmAdd(arg1,arg2){
        var r1,r2,m; 
        try{r1=arg1.toString().split(".")[1].length;}catch(e){r1=0;}
        try{r2=arg2.toString().split(".")[1].length;}catch(e){r2=0;}
        m=Math.pow(10,Math.max(r1,r2));
        return (accMul(arg1,m)+accMul(arg2,m))/m;
	}
// 精度计算减法
	function dcmMinus(arg1,arg2){
		var r1,r2,m;
		try{r1=arg1.toString().split(".")[1].length;}catch(e){r1=0;}
		try{r2=arg2.toString().split(".")[1].length;}catch(e){r2=0;}
		m=Math.pow(10,Math.max(r1,r2));
		return (accMul(arg1,m)-accMul(arg2,m))/m;
	}

9,防抖函数

// 通过定时器实现
function debounce(fn,delay){
    let timer = null;
    return function() {
        if(timer){    // 如果创建过定时器就清空并重新创建
            clearTimeout(timer) 
        }
        timer = setTimeout(fn,delay) // 简化写法
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值