Skip to content

实现一个防抖函数

ts
const debounce = <T extends (...args: any[]) => any>(fn: T, time: number) => {
  let timer: ReturnType<typeof setTimeout> | null = null;
  return function (...args: Parameters<T>): void {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      fn.apply(this, args);
      timer = null;
    }, time);
  };
};
const debounce = <T extends (...args: any[]) => any>(fn: T, time: number) => {
  let timer: ReturnType<typeof setTimeout> | null = null;
  return function (...args: Parameters<T>): void {
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      fn.apply(this, args);
      timer = null;
    }, time);
  };
};

实现一个GetArrayType,可以判断数组每一项的类型

ts
type GetArrayType<T> = T extends Array<infer U> ? U : never;
type Target = GetArrayType<Test>;
type GetArrayType<T> = T extends Array<infer U> ? U : never;
type Target = GetArrayType<Test>;

一个数组,找出三个数相乘的最大积

ts
const getMax = (nums: number[]): number => {
  if (nums.length < 3) {
    throw new Error("数组长度必须至少为3");
  }
  nums.sort((a, b) => b - a);
  // 考虑最大三个正数或两个最小负数与一个最大正数的情况
  return Math.max(
    nums[0] * nums[1] * nums[2],
    nums[0] * nums[nums.length - 1] * nums[nums.length - 2]
  );
};

var maximumProduct = function(nums) {
    // 最小的和第二小的
    let min1 = Number.MAX_SAFE_INTEGER, min2 = Number.MAX_SAFE_INTEGER;
    // 最大的、第二大的和第三大的
    let max1 = -Number.MAX_SAFE_INTEGER, max2 = -Number.MAX_SAFE_INTEGER, max3 = -Number.MAX_SAFE_INTEGER;

    for (const x of nums) {
        if (x < min1) {
            min2 = min1;
            min1 = x;
        } else if (x < min2) {
            min2 = x;
        }

        if (x > max1) {
            max3 = max2;
            max2 = max1;
            max1 = x;
        } else if (x > max2) {
            max3 = max2;
            max2 = x;
        } else if (x > max3) {
            max3 = x;
        }
    }

    return Math.max(min1 * min2 * max1, max1 * max2 * max3);
};
const getMax = (nums: number[]): number => {
  if (nums.length < 3) {
    throw new Error("数组长度必须至少为3");
  }
  nums.sort((a, b) => b - a);
  // 考虑最大三个正数或两个最小负数与一个最大正数的情况
  return Math.max(
    nums[0] * nums[1] * nums[2],
    nums[0] * nums[nums.length - 1] * nums[nums.length - 2]
  );
};

var maximumProduct = function(nums) {
    // 最小的和第二小的
    let min1 = Number.MAX_SAFE_INTEGER, min2 = Number.MAX_SAFE_INTEGER;
    // 最大的、第二大的和第三大的
    let max1 = -Number.MAX_SAFE_INTEGER, max2 = -Number.MAX_SAFE_INTEGER, max3 = -Number.MAX_SAFE_INTEGER;

    for (const x of nums) {
        if (x < min1) {
            min2 = min1;
            min1 = x;
        } else if (x < min2) {
            min2 = x;
        }

        if (x > max1) {
            max3 = max2;
            max2 = max1;
            max1 = x;
        } else if (x > max2) {
            max3 = max2;
            max2 = x;
        } else if (x > max3) {
            max3 = x;
        }
    }

    return Math.max(min1 * min2 * max1, max1 * max2 * max3);
};

一个蒙层需要考虑的问题

动态虚拟列表实现

requestAnimationCallback是怎么解决的卡顿问题

RequestIdleCallback是怎么解决的卡顿问题

实现一个轮播图

Released under the MIT License.