封装一些常用的工具函数(随时更新)

60 阅读1分钟
// >>>>>>>>>>>>>>>>>>>>>>>>> 变量定义 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

// 唯一标识,用来判断数据是否是null或者undefined
const NULL_OR_UNDEFINED =  Symbol("null_or_undefined")

// 数据类型映射
const DATA_TYPE_MAP = {
  NUMBER: "[object Number]",
  STRING: "[object String]",
  OBJECT: "[object Object]",
  FUNCTION: "[object Function]",
  ARRAY: "[object Array]",
  MAP: "[object Map]",
  SET: "[object Set]",
  REGEXP: "[object Regexp]",
  DATE: "[object Date]"
}


// >>>>>>>>>>>>>>>>>>>>>>>>> 工具函数的定义 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/**
 * 是否为null或者undefined
 * @param {any} data 目标数据
 * @return {Boolean}
 */
function isNullOrUndefined(data){
  return (data ?? NULL_OR_UNDEFINED) === NULL_OR_UNDEFINED
}

/**
 * 获得数据的类型
 * @param {any} data 目标数据
 * @return {String} 数据类型 
 */
function getType(data){
  return Object.prototype.toString.call(data)
}

/**
 * 是否为数值类型
 * @param {any} data 目标数据
 * @returns {Boolean} 判断结果
 */
function isNumber(data){
  return getType(data) === DATA_TYPE_MAP.NUMBER
}

/**
 * 是否为字符串类型
 * @param {any} data 目标数据
 * @returns {Boolean} 判断结果
 */
function isString(data){
  return getType(data) === DATA_TYPE_MAP.STRING
}

/**
 * 是否为对象类型
 * @param {any} data 目标数据
 * @returns {Boolean} 判断结果
 */
function isObject(data){
  return getType(data) === DATA_TYPE_MAP.OBJECT
}

/**
 * 是否为函数类型
 * @param {any} data 目标数据
 * @returns {Boolean} 判断结果
 */
function isFunction(data){
  return getType(data) === DATA_TYPE_MAP.FUNCTION
}

/**
 * 是否为数组类型
 * @param {any} data 目标数据
 * @returns {Boolean} 判断结果
 */
function isArray(data){
  return getType(data) === DATA_TYPE_MAP.ARRAY
}

/**
 * 对象的拓展
 * @param {Object} target 目标对象
 * @param {Object} source 源对象
 * @returns 包装好的对象,不影响目标对象
 */
function extend(target = {}, source = {}){
  return Object.assign({}, target, source)
}

/**
 * 防抖函数
 * @param {Function} fn 目标执行函数
 * @param {Number} gap 延迟时间(s)
 * @returns {Function} 包装后的函数
 */
function debounce(fn, gap=1){
  let timer = null
  fn = isFunction(fn) ? fn : function(){}
  return function(){
    timer && clearTimeout(timer)
    timer = setTimeout(fn.bind(this), gap*1000)
  }
}

/**
 * 节流函数
 * @param {Function} fn 目标执行函数
 * @param {number} gap 延迟时间(s)
 * @return {Function} 包装后的函数
 */
function throttel(fn, gap=1){
  let prevTime = 0
  fn = isFunction(fn) ? fn : function(){}
  return function(){
    const curTime = Date.now()
    const during = curTime - prevTime
    if(during >= gap*1000){
      prevTime = curTime
      fn.call(this)
    }
  }
}

/**
 * 设置时间前缀
 * @param {number} time 时间数值
 * @returns {String} 前缀补0的时间
 */
function setTimePrefix(time){
  return String(time).padStart(2, "0")
}