Js一些手写题

197 阅读1分钟

1.Promise

class Promise {
  constructor(executor) {
    this.status = "pending";     // 初始化状态为pending
    this.value = undefined;      // 初始化返回的成功的结果或者失败的原因
    // 这里是resolve方法,成功后执行,将状态改变为resolved,并且将结果返回
    let resolve = result => {
      if (this.status !== "pending") return;  // 状态一旦改变,就不会再变
      this.status = "resolved";
      this.value = result;
    }
    // 这里是reject方法,异常时执行,状态改为rejected,并且将失败的原因返回
    let reject = reason => {
      if (this.status !== "pending") return;
      this.status = "rejected";
      this.value = reason;
    }
    try {
      executor(resolve, reject)
    } catch (error) {
      reject(error)
    }
  }
  then(onFulfilled, onRejected) {
    // 状态为fulfilled,执行onFulfilled,传入成功的值
    if (this.state === 'fulfilled') {
      onFulfilled(this.value);
    };
    // 状态为rejected,执行onRejected,传入失败的原因
    if (this.state === 'rejected') {
      onRejected(this.reason);
    };
  }
}

2.数组扁平化处理

es6
let arr = [1, [2, [34]]];
arr.flat(Infinity)
递归
let arr = [1, [2, [34]]];
function flatter(arr,result = []){
    for(let i = 0;i<arr.length;i++){
        if(Array.isArray(arr[i])){
            flatter(arr[i],result)
        }else{
            result.push(arr[i])
        }
    }
    return result
}
console.log(flatter(arr))
reduce 方法
let arr = [1, [2, [34]]];

function flatter(arr){
    return arr.reduce((prev,next)=>{
        return prev.concat(Array.isArray(next)?flatter(next):next)
    },[])
}
console.log(flatter(arr))

3.深拷贝

 const cloneDeep = (obj) => {
    if (obj === null || typeof obj !== 'object') return obj
    let copy = Array.isArray(obj) ? [] : {}
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        copy[key] = cloneDeep(obj[key])
      }
    }
    return copy
  }