JavaScript常用的工具函数

JavaScript常用的工具函数

1、数字操作

1.1、生成指定范围的随机数

/**
 * 生成指定范围内的随机数字
 * @param min
 * @param max
 * @returns {*}
 */
function randomNumber(min, max) {
    // Math.floor() 向下取整
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

alert(randomNumber(10, 20));

1.2、数字千分位分隔

/**
 * 数字千分位分割
 * @param num
 * @returns {string|*}
 */
function formatThousands(num) {
    var number = num.toString();
    var length = number.length;
    if (length <= 3) {
        return num;
    }
    var temp = "";
    var remainder = length % 3;
    if (remainder > 0) {
        // 不是3的整数
        return number.slice(0, remainder) + "," + number.slice(remainder, length).match(/\d{3}/g).join(",") + temp;
    } else {
        return number.slice(0, length).match(/\d{3}/g).join(",") + temp;
    }
}

2、数组操作

2.1、数组乱序

/**
 * 数组乱序
 * @param arr
 */
function arrScrambling(arr) {
    for (var i = 0; i < arr.length; i++) {
        var randomIndex = Math.round(Math.random() * (arr.length - 1 - i)) + i;
        [arr[i], arr[randomIndex]] = [arr[randomIndex], arr[i]];
    }
    return arr;
}

2.2、数组扁平化

/**
 * 数组扁平化处理
 * @param arr
 * @returns {[]}
 */
function arrFlatten(arr) {
    var result = [];
    for (var i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])) {
            result = result.concat(arrFlatten(arr[i]));
        } else {
            result.push(arr[i]);
        }
    }
    return result;
}
var arr = [1, 2, 3, 4, 5, 6, [7, 8]];

alert(arrFlatten(arr)); // [1, 2, 3, 4, 5, 6, 7, 8]

2.3、数组中获取随机元素

/**
 * 随机获取一个数组元素
 * @param arr
 * @returns {*}
 */
function sample(arr) {
    return arr[Math.floor(Math.random() * arr.length)];
}

3、字符串操作

3.1、生成随机字符串

/**
 * 随机生成字符串
 * @param len
 * @returns {string}
 */
function randomString(len) {
    var chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz123456789";
    var strLen = chars.length;
    var randomStr = "";
    for (var i = 0; i < len; i++) {
        randomStr += chars.charAt(Math.floor(Math.random() * strLen));
    }
    return randomStr;
}

alert(randomString(10));

3.2、字符串首字母大写

/**
 * 字符串首字母大写
 * @param str
 * @returns {string}
 */
function fistLetterUpper(str) {
    return str.charAt(0).toUpperCase() + str.slice(1);
}

alert(fistLetterUpper("a111222"));

3.3、手机号中间四位变成*

/**
 * 手机号中间四位变成*
 * @param tel
 * @returns {string}
 */
function telFormat(tel) {
    tel = String(tel);
    return tel.slice(0, 3) + "****" + tel.slice(7);
}
alert(telFormat(19987131174));

3.4、驼峰命名转换成短横线命名

/**
 * 驼峰命名转换成短横线或下划线命名
 * @param str
 * @param mark
 * @returns {void | string | *}
 */
function getKebabCase(str, mark) {
    return str.replace(/[A-Z]/g, function (item) {
        return mark + item.toLowerCase();
    });
}

3.5、全角转换为半角

/**
 * 全角转换为半角
 * 全角:指一个字符占用两个标准字符位置
 * 半角:指一个字符占用一个标准字符位置
 * @param str
 * @returns {string}
 */
function toCDB(str) {
    var result = "";
    for (var i = 0; i < str.length; i++) {
        var code = str.charCodeAt(i);
        if (code >= 65281 && code <= 65374) {
            result += String.fromCharCode(str.charCodeAt(i) - 65248);
        } else if (code == 12288) {
            result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32);
        } else {
            result += str.charAt(i);
        }
    }
    return result;
}

3.6、半角转换为全角

/**
 * 半角转换为全角
 * @param str
 * @returns {string}
 */
function toDBC(str) {
    var result = "";
    for (var i = 0; i < str.length; i++) {
        var code = str.charCodeAt(i);
        if (code >= 33 && code <= 126) {
            result += String.fromCharCode(str.charCodeAt(i) + 65248);
        } else if (code == 32) {
            result += String.fromCharCode(str.charCodeAt(i) + 12288 - 32);
        } else {
            result += str.charAt(i);
        }
    }
    return result;
}
alert(toDBC("abc"));

4、日期操作

4.1、把日期格式化成指定的格式字符串

/**
 * 把日期格式化成指定的格式
 * @param data 日期
 * @param pattern 日期格式
 * @returns {string}
 */
function dateFormat(date, pattern) {
    if (!date instanceof Date) {
        return "";
    }
    var map = {
        "M+": date.getMonth() + 1,
        "d+": date.getDate(),
        "H+": date.getHours(),
        "m+": date.getMinutes(),
        "s+": date.getSeconds(),
        "q+": Math.floor((date.getMonth() + 3) / 3),
        "S": date.getMilliseconds()
    };

    if (/(y+)/.test(pattern)) {
        pattern = pattern.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
    }
    for (var k in map) {
        if (new RegExp("(" + k + ")").test(pattern)) {
            pattern = pattern.replace(RegExp.$1, (RegExp.$1.length == 1) ? (map[k]) : (("00" + map[k]).substr(("" + map[k]).length)));
        }
    }
    return pattern;
}

alert(dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss"));

4.2、计算到期时间

/**
 * 计算到期时间
 * @param date 日期对象
 * @param expire 期限(单位天)
 * @returns {number} 时间戳
 */
function getExpireTime(date, expire) {
    if (typeof date === "undefined" || date == null) {
        date = new Date(); // 当前时间
    }
    return date.setDate(date.getDate() + expire); // 获取时间戳
}

var date = new Date();
console.log(dateFormat(date, "yyyy-MM-dd HH:mm:ss"));
console.log(dateFormat(new Date(getExpireTime(date, 10)), "yyyy-MM-dd HH:mm:ss"));

5、本地存储操作

在浏览器中,本地存储有localStoragesessionStorage两种实现方式,他们之间的区别是:

1、localStorage的生命周期是永久的,除非在浏览器提供的UI上手动清除localStorage信息,否则永远存在。

2、sessionStorage的生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭,存储的数据也会被清空。

5.1、存储、获取、删除localStorage

/**
 * 本地存储
 * @param key
 * @param value
 */
function setLocalStorage(key, value) {
    if (!key) {
        return;
    }
    if (typeof value !== "string") {
        value = JSON.stringify(value);
    }
    window.localStorage.setItem(key, value);
}

setLocalStorage("person", {age: 11, name: "alex"});

/**
 * 获取本地存储
 * @param key
 * @returns {string}
 */
function getLocalStorage(key) {
    if (!key) {
        return;
    }
    return window.localStorage.getItem(key);
}

/**
 * 删除本地存储
 * @param key
 */
function removeLocalStorage(key) {
    if (!key) {
        return;
    }
    window.localStorage.removeItem(key);
}

5.1、存储、获取、删除sessionStorage

/**
 * session本地存储
 * @param key
 * @param value
 */
function setSessionStorage(key, value) {
    if (!key) {
        return;
    }
    if (typeof value !== "string") {
        value = JSON.stringify(value);
    }
    window.sessionStorage.setItem(key, value);
}
// setSessionStorage("person", {name: "alex", age: "15"});

/**
 * session本地存储获取
 * @param key
 * @returns {string}
 */
function getSessionStorage(key) {
    if (!key) {
        return;
    }
    return window.sessionStorage.getItem(key);
}

/**
 * session本地存储删除
 * @param key
 */
function removeSessionStorage(key) {
    if (!key) {
        return;
    }
    window.sessionStorage.removeItem(key);
}

6、操作cookie

6.1、新增、获取一条cookie

/**
 * 设置一条Cookie
 * @param key
 * @param value
 * @param expires 到期时间(单位天)
 */
function setCookie(key, value, expires) {
    if (!key || !value) {
        return;
    }
    var date = new Date();
    date = date.setDate(date.getDate() + expires);
    document.cookie = key + "=" + value + ";expires=" + new Date(date).toUTCString();
}

setCookie("name", "alex", 2); // 两天后到期

/**
 * 获取指定的Cookie
 * @param key
 * @returns {string|null}
 */
function getCookie(key) {
    var cookies = unescape(document.cookie); // cookie之间是用; 隔开的
    if (!cookies) {
        return null;
    }
    var cookieList = cookies.split("; ");
    for (var i = 0; i < cookieList.length; i++) {
        var cookieArr = cookieList[i].split("=");
        if (cookieArr[0] === key) {
            return cookieArr[1];
        }
    }
    return null;
}

console.log(getCookie("name"));

6.2、删除Cookie

/**
 * 删除指定的Cookie
 * @param key
 */
function deleteCookie(key) {
    if (!key) {
        return;
    }
    document.cookie = encodeURIComponent(key) + "=;expires=" + new Date();
}

deleteCookie("name");

7、格式校验

7.1、身份证号码合法校验

/**
 * 身份证号码合法校验
 * @param num 身份证号码
 * @returns {boolean}
 */
function checkIdCardNo(num) {
    if (!num) {
        return false;
    }
    num = num.toUpperCase(); // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X。
    if (!(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/.test(num))) {
        // alert('输入的身份证号长度不对,或者号码不符合规定!\n15位号码应全为数字,18位号码末位可以为数字或X。');
        // alert('身份证号长度不正确或不符合规定!');
        return false;
    }
    //验证前2位,城市符合
    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: "国外"
    };
    if (aCity[parseInt(num.substr(0, 2))] == null) {
        // alert('身份证号不正确或不符合规定!');
        return false;
    }
    
    // 下面分别分析出生日期和校验位
    var len, re;
    len = num.length;
    if (len == 15) {
        re = new RegExp(/^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/);
        var arrSplit = num.match(re); //检查生日日期是否正确
        var dtmBirth = new Date('19' + arrSplit[2] + '/' + arrSplit[3] + '/' + arrSplit[4]);
        var bGoodDay;
        bGoodDay = (dtmBirth.getYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
        if (!bGoodDay) {
            // alert('身份证号的出生日期不对!');
            return false;
        } else { // 将15位身份证转成18位 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
            var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
            var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
            var nTemp = 0, i;
            num = num.substr(0, 6) + '19' + num.substr(6, num.length - 6);
            for (i = 0; i < 17; i++) {
                nTemp += num.substr(i, 1) * arrInt[i];
            }
            num += arrCh[nTemp % 11];
            return true;
        }
    }
    if (len == 18) {
        re = new RegExp(/^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/);
        var arrSplit = num.match(re); //检查生日日期是否正确
        var dtmBirth = new Date(arrSplit[2] + "/" + arrSplit[3] + "/" + arrSplit[4]);
        var bGoodDay;
        bGoodDay = (dtmBirth.getFullYear() == Number(arrSplit[2])) && ((dtmBirth.getMonth() + 1) == Number(arrSplit[3])) && (dtmBirth.getDate() == Number(arrSplit[4]));
        if (!bGoodDay) {
            // alert('身份证号的出生日期不对!');
            return false;
        } else { //检验18位身份证的校验码是否正确。 //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
            var valnum;
            var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
            var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
            var nTemp = 0, i;
            for (i = 0; i < 17; i++) {
                nTemp += num.substr(i, 1) * arrInt[i];
            }
            valnum = arrCh[nTemp % 11];
            if (valnum != num.substr(17, 1)) {
                // alert('18位身份证的校验码不正确!应该为:' + valnum);
                // alert('18位身份证号的校验码不正确!');
                return false;
            }
            return true;
        }
    }
    return false;
}

7.2、统一社会信用代码校验

/**
 * 统一社会信用代码校验
 * @param code 统一社会信用代码
 * @returns {boolean} true|false
 */
function checkSocialCreditCode(code) {
    if (!code) {
        return false;
    }
    var pattern = /^[0-9A-Z]+$/; // + 表示匹配 1-无穷
    if (code.length != 18 || !pattern.test(code)) {
        // 不是有效的统一社会信用代码
        return false;
    }
    var anCode = ""; // 统一社会信用代码的每一个值
    var codeWeight = 0; // 统一社会信用代码的每一个值的权重
    var total = 0;
    var weightingFactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]; // 加权因子
    var str = '0123456789ABCDEFGHJKLMNPQRTUWXY';
    // 不用I、O、S、V、Z
    for (var i = 0; i < code.length - 1; i++) {
        anCode = code.substring(i, i + 1);
        codeWeight = str.indexOf(anCode);
        // 计算权重与加权因子相乘之和
        total = total + codeWeight * weightingFactors[i];
    }
    var logicCheckCode = 31 - total % 31;
    if (logicCheckCode == 31) {
        logicCheckCode = 0;
    }
    var item = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y";
    var itemArray = item.split(",");
    logicCheckCode = itemArray[logicCheckCode];

    var checkCode = code.substring(17, 18);
    if (checkCode != logicCheckCode) {
        return false;
    }
    return true;
}

console.log(checkSocialCreditCode("913100007033013011"));

7.3、是否包含中文判断

/**
 * 是否包含中文判断
 * @param value 一段字符串
 * @returns {boolean}
 */
function haveCNChars(value) {
    return /[\u4e00-\u9fa5]/.test(value);
}

console.log(haveCNChars(123)); // false
console.log(haveCNChars("你好123")); // true

7.4、是否为IPv6地址

/**
 * 是否为isIPv6地址
 * @param str
 * @returns {boolean}
 */
function isIPv6(str) {
    return Boolean(str.match(/:/g)?str.match(/:/g).length<=7:false && /::/.test(str)?/^([\da-f]{1,4}(:|::)){1,6}[\da-f]{1,4}$/i.test(str):/^([\da-f]{1,4}:){7}[\da-f]{1,4}$/i.test(str));
}

7.5、是否为正确邮箱地址

/**
 * 是否为正确邮箱地址
 * @param value
 * @returns {boolean}
 */
function isEmail(value) {
    return /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/.test(value);
}

console.log(isEmail("3299447929@qq.com"));
console.log(isEmail("lai@icloud.com"));

7.6、是否为中国大陆手机号

/**
 * 验证是否为中国大陆手机号码
 * @param number 手机号码
 * @returns {boolean}
 */
function checkTelephoneNumber(number) {
    if (!number) {
        return false;
    }
    return /^1[3,4,5,6,7,8,9][0-9]{9}$/.test(number.toString());
}

console.log(checkTelephoneNumber("19987131172")); // true

8、URL操作

8.1、获取URL参数列表

/**
 * 获取URL查询参数
 * @param url URL地址
 * @returns {{}}
 */
function getRequestParam(url) {
    if (!url || url == null || typeof url == "undefined") {
        url = location.search;
    }
    // 1.截取 ? 后面的字符串
    var paramStr = /.+\?(.+)$/.exec(url)[1];
    // 2.使用 & 分割后存储数组中
    var paramList = paramStr.split("&");
    var param = {};
    for (var i = 0; i < paramList.length; i++) {
        var item = paramList[i];
        if (/=/.test(item)) {
            var [name, value] = item.split("=");
            // 解码
            value = decodeURIComponent(value);
            value = /^\d+$/.test(value) ? parseFloat(value) : value;
            if (param.hasOwnProperty(name)) {
                param[name] = [].concat(param[name], value);
            } else {
                param[name] = value;
            }
        } else {
            param[item] = true; // 处理没有 value 的参数(给一个默认值true)
        }
    }
    return param;
}

var param = getRequestParam("https://editor.csdn.net/md/?articleId=124081727");
for (var i in param) {
    console.log(i + "=" + param[i]);
}

8.2、对象拼接成URL参数

/**
 * 对象转url请求参数
 * @param param
 * @returns {string|null}
 */
function convertToUrl(param) {
    if (!param) {
        return null;
    }
    var paramList = [];
    for (var key in param) {
        paramList.push(key + "=" + param[key]);
    }
    return "?" + paramList.join("&");
}

var p = {
    name: "a",
    age: 2
};

console.log(convertToUrl(p));

8.3、修改URL中的参数

/**
 * 修改URL中的参数
 * @param param
 * @param replace
 * @returns {string}
 */
function replaceParam(url, param, replace) {
    if (!url) {
        return null;
    }
    // var url = window.location.href.toString();
    var re = eval("/(" + param + "=)([^&]*)/gi"); // eval() 将字符串解析js代码并运行
    // window.location.href = url.replace(re, param + "=" + replace);
    return url.replace(re, param + "=" + replace);
}

9、设备判断

9.1、判断是移动还是PC

/**
 * 移动|PC设备判断
 * @returns {string}
 */
function getClientDesktopType() {
    console.log(navigator.userAgent);
    if ((navigator.userAgent.match(/(iPhone|iPod|Android|ios|iOS|iPad|Backerry|WebOS|Symbian|Windows Phone|Phone)/i))) {
        return 'mobile';
    }
    return 'desktop';
}
console.log(getClientDesktopType());

9.2、判断是苹果还是安卓移动设备

/**
 * 判断苹果还是安卓移动设备
 * @returns {boolean}
 */
function isAppleMobileDevice() {
    let reg = /iphone|ipod|ipad|Macintosh/i;
    return reg.test(navigator.userAgent.toLowerCase());
}

console.log(isAppleMobileDevice()); // false

9.3、判断是Windows还是Mac系统

/**
 * 判断是windows还是mac系统
 * @returns {string}
 */
function getOsType() {
    var agent = navigator.userAgent.toLowerCase();
    var isMac = /macintosh|mac os x/i.test(agent); // i 不区分大小写匹配
    var isWindows = agent.indexOf("win64") >= 0 || agent.indexOf("wow64") >= 0 || agent.indexOf("win32") >= 0 || agent.indexOf("wow32") >= 0;
    if (isMac) {
        return "mac";
    }
    if (isWindows) {
        return "windows";
    }
}

console.log(getOsType()); // windows

9.4、获取浏览器型号和版本

/**
 * 获取浏览器型号及版本信息
 * @returns {{type: string, version: number}}
 */
function getCurrentBrowserInfo() {
    var agent = navigator.userAgent.toLowerCase();
    if (agent.indexOf("msie") >= 0) {
        // ie < 11
        return {type: "IE", version: Number(agent.match(/msie ([\d]+)/)[1])};
    }
    if (agent.match(/trident\/.+?rv:(([\d.]+))/)) {
        // ie 11
        return {type: "IE", version: 11};
    }
    if (agent.indexOf("edge") >= 0) {
        return {type: "Edge", version: Number(agent.match(/edge\/([\d]+)/)[1])};
    }
    if (agent.indexOf("firefox") >= 0) {
        return {type: "Firefox", version: Number(agent.match(/firefox\/([\d]+)/)[1])};
    }
    if (agent.indexOf("chrome") >= 0) {
        return {type: "Chrome", version: Number(agent.match(/chrome\/([\d]+)/)[1])};
    }
    if (agent.indexOf("opera") >= 0) {
        return {type: "Opera", version: Number(agent.match(/opera.([\d]+)/)[1])};
    }
    if (agent.indexOf("Safari") >= 0) {
        return {type: "Safari", version: Number(agent.match(/version\/([\d]+)/)[1])};
    }
    return {type: agent, version: -1};
}

console.log(getCurrentBrowserInfo()); // {type: 'Chrome', version: 99}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lambda.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值