JS工具函数
用于工程化开发,记录,备用
/** * 返回 [min, max) 间的随机整数 * @param {Number} min * @param {Number} max * @returns {Number} */ export function getRandom(min, max) { return Math.floor(Math.random() * (max - min) + min) } /** * 获取随机 rgb 颜色 * @returns {String} */ export function getRandomRgb() { return `rgb(${getRandom(0, 256)}, ${getRandom(0, 256)}, ${getRandom(0, 256)})` } /** * 获取随机 hex 颜色 * @returns {String} */ export function getRandomHex() { return '#' + parseInt(Math.random() * 0xffffff).toString(16).padStart(6, '0') } /** * 返回随机id * @returns {String} */ export function randomId() { const char = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' let result = '' for (let i = 0; i < 16; i++) { result += char[getRandom(0, char.length)] } return result } /** * 判断一个值是否是Object * @param {*} value * @returns {Boolean} */ export function isObject(value) { return Object.prototype.toString.call(value) === '[object Object]' } /** * 判断value是否为空 * @param {*} value * @returns {Boolean} */ export function isEmpty(value) { if (value === null || typeof value === 'undefined') { return true } if (typeof value === 'number' && isNaN(value)) { return true } if (typeof value === 'string' && value === '') { return true } if (Array.isArray(value) && value.length <= 0) { return true } if (isObject(value) && Object.keys(value).length <= 0) { return true } return false } /** * 判断value是否不为空 * @param {*} value * @returns {Boolean} */ export function isNotEmpty(value) { return !isEmpty(value) } /** * 将origin中的属性赋值到target中 * @param {Object} target 目标对象 * @param {Object} origin 源对象 * @returns {Object} */ export function copyProp(target, origin) { if (!isObject(target) || !isObject(origin)) { throw new Error('Argument must be of object type!') } if (isEmpty(origin)) { return target } for (const key in origin) { target[key] = origin[key] } return target } /** 深拷贝 */ export function deepClone(value) { if (typeof value !== 'object' || isEmpty(value)) { return value } let result = Array.isArray(value) ? [] : {} for (const key in value) { result[key] = deepClone(value[key]) } return result } /** * 模拟异步延时 * @param {Number} [duration=500] 延迟的时间(ms) * @returns {Promise} */ export function delay(duration = 500) { return new Promise((resolve) => setTimeout(resolve, duration)) } /** * 函数只调用一次函数 * @param {Function} fn * @returns {Function} */ export function once(fn) { let executed = false return () => { if (!executed) { executed = true fn.apply(this, ...arguments) } } } /** * 防抖 * @param {Function} fn 要进行防抖的函数 * @param {Number} [duration=100] 延迟时间 * @returns {Function} */ export function debounce(fn, duration = 100) { let timer = null return (...args) => { clearTimeout(timer) timer = setTimeout(() => { fn(...args) }, duration) } } /** * 节流 * @param {Function} fn 要节流的函数 * @param {Number} [duration=50] 延迟时间 * @returns */ export function throttle(fn, duration = 50) { let mark = 0 return () => { if (Date.now() - mark >= duration) { fn.apply(this, arguments) mark = Date.now() } } } /** 返回顶部 */ export function goTop() { window.scroll({ top: 0, left: 0, behavior: 'smooth', }) } /** * 获取url参数 * @param {String} [url=location.href] url地址,不传使用当前网站url * @returns {Object} */ export function getUrlParams(url = location.href) { const index = url.indexOf('?') const result = {} if (index === -1) { return result } const arr = url.substring(index + 1).split('&') for (let i = 0; i < arr.length; i++) { const param = arr[i].split('=') result[param[0]] = param[1] } return result } /** * 判断dom容器是否有滚动条 * @param {HTMLElement} [dom=document.body] 容器,不传默认body * @returns {Boolean} */ export function hasScrollBar(dom) { if (dom) { const fullHeight = dom.offsetHeight ?? dom.scrollHeight return fullHeight > dom.clientHeight } else { return document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight) } } /** * 数组去重 * @param {Array} arr * @returns {Array} 去重后的数组 */ export function unique(arr) { return [...new Set(arr)] } /** * 数组对象去重 * @param {Array} arr 要去重的数组 * @param {String} attr 根据哪个属性去重 * @returns */ export function uniqueByAttr(arr, attr) { const attrs = [] return arr.filter((e) => !attrs.includes(e[attr]) && attrs.push(e[attr])) } /** * 手机号中间四位数 * 号 * @param {String} tel * @returns */ export function hideTel(tel) { return tel.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2') }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?