JavaScript 常用函数封装

深度拷贝

const deepClone = function (source) {
  const typeFn = Object.prototype.toString
  // 不传 source,或者不是数据并且不是对象时直接返回传入值
  if ((!justType(source, 'Object') && !justType(source, 'Array'))) {
    return source
  }
  function justType (item, type) { // 类型判断
    const typeString = typeFn.call(item)
    return ~typeString.indexOf(type)
  }
  function cloneHandler (source) {
    let target = justType(source, 'Object') ? {} : []
    for (let key in source) {
      const item = source[key]
      if (justType(item, 'Array') || justType(item, 'Object')) {
        target[key] = cloneHandler(item)
      } else {
        target[key] = item
      }
    }
    return target
  }
  return cloneHandler(source)
}

数组去重

function arrayUnique(arr){
  return [...new Set(arr)]
}

基于ES6 中的 Set 来实现,不过这里的数组去重只是基本类型的去重,对于数组中含有引用类型比如:对象则无能为力。

题外话,Set 方法其实还挺有用的,比如一个题目有几个选项,这几个选项不能同名,此是我们就可以用 Set 来实现校验,先把所有选项的题目放到一个数组中,然后用 Set 处理下得到一个去重的 set 集合,最后用这个集合的 size 和 原数组的 length 进行比较,相等说明没有重复项,不相等说明有重复项。

循环返回0、1

function justZeroAndOne(counter, limit = 2){
  return (counter + 1) % limit
}

在平时的开发中也不一定是只循环取 0和1,也有可能取其它数,这里只不过提供一种思路。比如:要循环显示几种颜色。函数默认是为,你也可以指定一个最大值,注意:循环出来的值会比limit 小 1。