Skip to content

面试手写题

sleep/delay

sleep 函数既是面试中常问到的一道代码题,也是日常工作,特别是测试中常用的一个工具函数。

js
const sleep = (seconds) => new Promise(resolve => setTimeout(resolve, seconds))
 
function delay (func, seconds, ...args) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      Promise.resolve(func(...args)).then(resolve)
    }, seconds)
  })
}

实现深拷贝

  1. 实现了函数拷贝、Map、Set、Array拷贝
js

// 获取正则表达式 修饰符(标记)
function __getRegExpFlags(re) {
  var flags = '';
  if (re.global) flags += 'g';
  if (re.ignoreCase) flags += 'i';
  if (re.multiline) flags += 'm';
  return flags;
}


// 获取数据类型
function getType(obj){
  return Object.prototype.toString.call(obj).slice(8,-1);
}
function cloneDeep(obj){
 
  const ret = {}
  
  for(let key in obj){
    const value = obj[key];
    let cloneValue = null
    // 如果是函数
    if(typeof value === 'function'){
        cloneValue = value.bind(ret);
    }
    else if(Array.isArray(value)){
      for(let val of value){
        cloneValue = cloneDeep(val)
      }
    }
    // 考虑正则表达式
    else if(getType(value) === "RegExp"){
       cloneValue = new RegExp(value.source, __getRegExpFlags(value));
    }
    else if (getType(value) === "Date") {
       cloneValue = new Date(value.getTime());
      // 处理Map 
    }else if(getType(value) === "Map"){      
       const map = new Map()

      for(let key in value){ 
        map.set(key ,cloneDeep(value[key]))
      }
      cloneValue  = map;
    }
    // 处理Set结构
    else if(getType(value) === "Set"){      
       const set = new Set()

      for(let key in value){ 
        set.set(key ,cloneDeep(value[key]))
      }
      cloneValue  = set;
    }
    else if(getType(value) === "object"){
      cloneValue = cloneDeep(val)
    }else{
      cloneValue = value
    }
    ret[key] = cloneValue
  }
  return ret
}


const obj = {
  re: /hello/,
  f() {},
  date: new Date(),
  map: new Map(),
  list: [1, 2, 3],
  set:new Set([12,3]),
  a: 3,
  b: 4,
};

const objClone = cloneDeep(obj)
// 测试map
obj.map.set("num",1)
console.log(obj.map.get("num"))
// 这里出问题
console.log(objClone.map.get("num"));


obj.set.add(0)
console.log(obj.set)
console.log(objClone.set)


const re = /hello/
console.log(re.source)

前端知识体系 · wcrane