深拷贝

function deepClone(obj, cache = new WeakMap()) {
  // 检查是否已经克隆过该对象,避免循环引用
  if (cache.has(obj)) {
    return cache.get(obj);
  }
 
  if (obj === null || typeof obj !== "object" || typeof value === "function") {
    return obj;
  }
 
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof RegExp) return new RegExp(obj);
 
  const result = Array.isArray(obj)
    ? []
    : Object.create(Object.getPrototypeOf(obj));
 
  cache.set(obj, result);
 
  for (const key of Reflect.ownKeys(obj)) {
    const value = obj[key];
    result[key] = deepClone(value, cache);
  }
 
  return result;
}

Promise.all

function promiseAll(promises) {
  // 判断输入是否为 Iterable
  const isIterable = typeof promises[Symbol.iterator] === "function";
 
  // 不是的话就回传错误讯息
  if (!isIterable) {
    return new TypeError("Arguments must be iterable");
  }
 
  // 把 Iterable 转成 Array
  promises = Array.from(promises);
 
  const outputs = []; // 先定义一个最终要 resolve 的 outputs,之后每个 promise 被 fulfilled 时,就放到 outputs 里面
  let resolveCounter = 0; // 记录有多少个 promise 已经 fulfilled
 
  return new Promise((resolve, reject) => {
    promises.forEach((promise, index) => {
      Promise.resolve(promise)
        .then((value) => {
          outputs[index] = value
          resolveCounter += 1
          if (resolveCounter === promises.length) {
            resolve(outputs);
          }
        })
        .catch((err) => {
          reject(err)
        })
    });
  });
}

Promise.race

function promiseRace(promises) {
  return new Promise((resolve, reject) => {
    // 迭代过 promises
    for (const p of promises) {
      p.then((val) => {
        // 只要有 fulfill 的,就马上 resolve
        resolve(val);
      }).catch((e) => {
        // 或是只要有 reject 的,就马上 reject
        reject(e);
      });
    }
  });
}