常用JavaScript工具函数

335 阅读1分钟

简介

主要记录一些常用的函数,方便后续使用

链式调用

compose函数的异步版本,适合拦截器编写,前一个Promise的返回值作为下一个Promise的参数.


export const chain = steps => {
  return async startParam => {
    let latestResult = startParam;
    while(steps.length) {
      const nextStep = steps.pop();
      if(nextStep) {
        latestResult = await nextStep(latestResult);
      }
    }
    return latestResult;
  };
};

判断Invalid Date

Invalid Date的getTime的值是NaN.

/**
 * 
 * @param {string|number|Date} date 
 */
const isInvalidDate = date => {
  return isNaN(new Date(date).getTime());
};

deep clone

weekMap主要记录当前已经clone的对象。防止循环引用引起的死循环。

const getClass = target => Object.prototype.toString.call(target).replace(/^\[object (\w+)\]$/, '$1')

let weakMap = null

function cloneDate(date) {
  return new Date(date)
}

function cloneMap(map) {
  return new Map(map)
}

function cloneSet(set) {
  return new Set(set)
}

function cloneObject(obj) {
  weakMap = weakMap || new WeakMap()
  if (weakMap.get(obj)) {
    return weakMap.get(obj)
  }
  const cobj = {}
  weakMap.set(obj, cobj)
  for(let k in obj) {
    cobj[k] = clone(obj[k])
  }
  return obj
}

function cloneArray(arrs) {
  return arrs.map(item => clone(item))
}

function clone(target) {
  const cls = getClass(target)
  switch (cls) {
    case 'Map':
      return cloneMap(target)
    case 'Object':
      return cloneObject(target)
    case 'Set':
      return cloneSet(target)
    case 'Date':
      return cloneDate(target)
    case 'Array':
      return cloneArray(target)
    default:
      return target
  }
}

function deepClone(target) {
  const res = clone(target)
  weakMap = null
  return res
}