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')
}