返回

手写常用的JS方法,全面提升你的JS技能

前端







## 前言

作为前端开发,JavaScript是重中之重,代码能力毋庸置疑是非常重要的。本文提供了高频前端面试题之手写常用JS方法,帮助您扩展并巩固自己的JS基础,提升您的编程技巧和编码能力,在工作中可以对常用的需求进行手写实现,比直接调用库更加灵活,对JS有更深入的了解。

本文涵盖了数组操作、字符串操作、函数操作、对象操作、时间操作、正则表达式操作等方面的方法,涵盖了前端开发的常见场景,非常适合前端开发人员学习和参考。

## 常用JS方法手写实现

### 数组操作

* **数组去重** 

```javascript
function unique(array) {
  return [...new Set(array)];
}
  • 数组扁平化
function flatten(array) {
  return array.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []);
}
  • 数组最大值
function max(array) {
  return Math.max(...array);
}

字符串操作

  • 字符串反转
function reverseString(str) {
  return str.split('').reverse().join('');
}
  • 字符串首字母大写
function capitalize(str) {
  return str.charAt(0).toUpperCase() + str.slice(1);
}
  • 字符串查找替换
function replaceAll(str, find, replace) {
  return str.replace(new RegExp(find, 'g'), replace);
}

函数操作

  • 函数柯里化
function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn(...args);
    } else {
      return function(...args2) {
        return curried(...args, ...args2);
      }
    }
  }
}
  • 函数防抖
function debounce(fn, delay) {
  let timer = null;
  return function(...args) {
    clearTimeout(timer);
    timer = setTimeout(() => {
      fn(...args);
    }, delay);
  }
}

对象操作

  • 对象深拷贝
function deepCopy(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }

  if (Array.isArray(obj)) {
    return obj.map(val => deepCopy(val));
  }

  const newObj = {};
  for (const key in obj) {
    newObj[key] = deepCopy(obj[key]);
  }

  return newObj;
}
  • 对象合并
function mergeObjects(...objs) {
  return objs.reduce((acc, obj) => {
    for (const key in obj) {
      acc[key] = obj[key];
    }
    return acc;
  }, {});
}

时间操作

  • 时间格式化
function formatDate(date, format) {
  const o = {
    'M+': date.getMonth() + 1,
    'd+': date.getDate(),
    'h+': date.getHours(),
    'm+': date.getMinutes(),
    's+': date.getSeconds(),
    'q+': Math.floor((date.getMonth() + 3) / 3),
    'S': date.getMilliseconds()
  };
  if (/(y+)/.test(format)) {
    format = format.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length));
  }
  for (const k in o) {
    if (new RegExp('(' + k + ')').test(format)) {
      format = format.replace(RegExp.$1, RegExp.$1.length === 1 ? o[k] : ('00' + o[k]).substr(('