整点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)
}
}
}
复制代码