深拷贝
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);
});
}
});
}