JS常用工具库

整点JS工具函数到时候用的时候直接复制粘贴

工作中总是会遇到重复的工作内容,写多了每次写都会很腻。于是就打算写一个工具函数,把大部分写的内容抽离出来就是自己的工具库了。部分是自己写的,大部分是自己从别人哪里借鉴的!

1.时间格式化

const formatTime = function(timestamp, nos = 1, bindf = '-') {
	if (!timestamp) {
		return '--'
	}
	if ((timestamp + "").includes('Invalid Date')) {
		return '--'
	}
	var date = new Date(timestamp)
	var strLen = timestamp.toString().length
	//判断时间戳是否不足13位,不足时低位补0,即乘以10的所差位数次方
	if (strLen < 13) {
		var sub = 13 - strLen
		sub = Math.pow(10, sub) //计算10的n次方
		date = new Date(timestamp * sub)
	}
	var y = date.getFullYear()
	var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1)
	var d = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate())
	var h = (date.getHours() < 10 ? '0' + (date.getHours()) : date.getHours())
	var m = (date.getMinutes() < 10 ? '0' + (date.getMinutes()) : date.getMinutes())
	var s = (date.getSeconds() < 10 ? '0' + (date.getSeconds()) : date.getSeconds())
	if (nos == 1) {
		return y + bindf + M + bindf + d + ' ' + h + ':' + m + ':' + s
	} else if (nos == 2) {
		return y + bindf + M + bindf + d
	} else if (nos == 3) {
		return M + bindf + d
	} else if (nos == 4) {
		return h + ':' + m + ':' + s
	} else if (nos == 5) {
		return y + bindf + M + bindf + d + ' ' + h + ':' + m
	} else if (nos == 6) {
		return M + bindf + d + ' ' + h + ':' + m + ':' + s
	} else if (nos == 7) {
		return M + bindf + d + ' ' + h + ':' + m
	} else if (nos == 8) {
		return d + '天' + h + '小时' + m + '分钟' + s + '秒'
	}
}
复制代码

2.解析url参数

function GetUrlParam(urlStr) {
	// ?a=1&b=2&c=3 ==> {a: "1", b: "2", c: "3"}
	let url = urlStr.toString();
	let arrObj = url.split("?");
	let params = Object.create(null)
	if (arrObj.length > 1) {
		arrObj = arrObj[1].split("&");
		arrObj.forEach(item => {
			item = item.split("=");
			params[item[0]] = item[1]
		})
	}
	return params;
}
复制代码

3.指定范围随机数

function RandomNum(min, max) {
	return Math.floor(Math.random() * (max - min + 1)) + min;
}
复制代码

4.深拷贝

function deepClone(obj, cache = new WeakMap()) {
	if (typeof obj !== 'object') return obj // 普通类型,直接返回
	if (obj === null) return obj
	if (cache.get(obj)) return cache.get(obj) // 防止循环引用,程序进入死循环
	if (obj instanceof Date) return new Date(obj)
	if (obj instanceof RegExp) return new RegExp(obj)
	// 找到所属原型上的constructor,所属原型上的constructor指向当前对象的构造函数
	let cloneObj = new obj.constructor()
	cache.set(obj, cloneObj) // 缓存拷贝的对象,用于处理循环引用的情况
	for (let key in obj) {
		if (obj.hasOwnProperty(key)) {
			cloneObj[key] = deepClone(obj[key], cache) // 递归拷贝
		}
	}
	return cloneObj
}
复制代码

5.字符串空格处理

function trim(str, type = 1) {
	/* 去除空格类型 1-所有空格  2-前后空格  3-前空格 4-后空格 默认为1 */
	if (type && type !== 1 && type !== 2 && type !== 3 && type !== 4) return;
	switch (type) {
		case 1:
			return str.replace(/\s/g, "");
		case 2:
			return str.replace(/(^\s)|(\s*$)/g, "");
		case 3:
			return str.replace(/(^\s)/g, "");
		case 4:
			return str.replace(/(\s$)/g, "");
		default:
			return str;
	}
}
复制代码

6.检测银行卡号

const checkBankNumber = function(bankno) {
	var lastNum = bankno.substr(bankno.length - 1, 1); //取出最后一位(与luhm进行比较)
	var first15Num = bankno.substr(0, bankno.length - 1); //前15或18位
	var newArr = [];
	for (var i = first15Num.length - 1; i > -1; i--) { //前15或18位倒序存进数组
		newArr.push(first15Num.substr(i, 1));
	}
	var arrJiShu = []; //奇数位*2的积 <9
	var arrJiShu2 = []; //奇数位*2的积 >9
	var arrOuShu = []; //偶数位数组
	for (var j = 0; j < newArr.length; j++) {
		if ((j + 1) % 2 == 1) { //奇数位
			if (parseInt(newArr[j]) * 2 < 9)
				arrJiShu.push(parseInt(newArr[j]) * 2);
			else
				arrJiShu2.push(parseInt(newArr[j]) * 2);
		} else //偶数位
			arrOuShu.push(newArr[j]);
	}
	var jishu_child1 = []; //奇数位*2 >9 的分割之后的数组个位数
	var jishu_child2 = []; //奇数位*2 >9 的分割之后的数组十位数
	for (var h = 0; h < arrJiShu2.length; h++) {
		jishu_child1.push(parseInt(arrJiShu2[h]) % 10);
		jishu_child2.push(parseInt(arrJiShu2[h]) / 10);
	}
	var sumJiShu = 0; //奇数位*2 < 9 的数组之和
	var sumOuShu = 0; //偶数位数组之和
	var sumJiShuChild1 = 0; //奇数位*2 >9 的分割之后的数组个位数之和
	var sumJiShuChild2 = 0; //奇数位*2 >9 的分割之后的数组十位数之和
	var sumTotal = 0;
	for (var m = 0; m < arrJiShu.length; m++) {
		sumJiShu = sumJiShu + parseInt(arrJiShu[m]);
	}
	for (var n = 0; n < arrOuShu.length; n++) {
		sumOuShu = sumOuShu + parseInt(arrOuShu[n]);
	}
	for (var p = 0; p < jishu_child1.length; p++) {
		sumJiShuChild1 = sumJiShuChild1 + parseInt(jishu_child1[p]);
		sumJiShuChild2 = sumJiShuChild2 + parseInt(jishu_child2[p]);
	}
	//计算总和
	sumTotal = parseInt(sumJiShu) + parseInt(sumOuShu) + parseInt(sumJiShuChild1) + parseInt(sumJiShuChild2);
	//计算Luhm值
	var k = parseInt(sumTotal) % 10 == 0 ? 10 : parseInt(sumTotal) % 10;
	var luhm = 10 - k;
	if (lastNum == luhm) {
		return true;
	} else {
		return false;
	}
}
复制代码

7.检测身份证号码

const checkIdCard = function(str) {
	var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
	return reg.test(str);
}
复制代码

8.检测手机号码

const checkPhone = function(val) {
	return (/^1[3-9]\d{9}$/.test(val))
}
复制代码

9.防抖 (只执行最后一次)

function debounce(fn, delay) {
	let timer
	return function(...args) {
		if (timer) {
			clearTimeout(timer)
		}
		timer = setTimeout(() => {
			fn.apply(this, args)
		}, delay)
	}
}
复制代码

10.节流 (只执行第一次)

function throttle(fn, delay) {
	let last = 0 // 上次触发时间
	return (...args) => {
		const now = Date.now()
		if (now - last > delay) {
			last = now
			fn.apply(this, args)
		}
	}
}

复制代码

猜你喜欢

转载自juejin.im/post/7033669796369711141