手写一些简单的js方法

手写深拷贝

const deepClone = function(obj, cache = new WeakMap()) {
    // 判断是否是引用数据类型,基础数据类型本身就是地址拷贝
    if (obj === null || typeof obj !== "object") return obj;
    if (obj instanceof Date) return new Date(obj); // 处理时间函数
    if (obj instanceof RegExp) return new RegExp(obj); // 处理正则
    // 判断是否存在循环引用
    if (cache.get(obj)) return cache.get(obj);
   
    // 判断是数组还是对象
    const result = obj instanceof Array ? [] : {};
    //
    cache.set(obj, result);
    // 将每个源对象和拷贝的对象存到cache中,上面判断cache中是否存在循环引用
    for (const key in obj) {
      if (obj[key] && typeof obj[key] === "object") {
        result[key] = deepClone(obj[key], cache);
      } else {
        result[key] = obj[key];
      }
    }
    return result;
  };

用promise封装ajax

function pajax({
    url= null,
    method = 'GET',
    dataType = 'JSON',
    async = true}){
    return new Promise((resolve, reject) => {
        let xhr = new XMLHttpRequest()
        xhr.open(method, url, async)
        xhr.responseType = dataType
        xhr.onreadystatechange = () => {
            if(!/^[23]\d{2}$/.test(xhr.status)) return
            if(xhr.readyState === 4) {
                let result = xhr.responseText
                resolve(result)
            }
        }
        xhr.onerror = (err) => {
            reject(err)
        }
        xhr.send()
    })
}   

实现函数科里化

function klh(...v){
    let args = []
    v.forEach(item=>{
        args.push(item)
    });
    let inner = function(value){
        args.push(value)
        return inner
    }
    inner.toString = function(){
        let ret = 0;
        args.forEach(item=>{
            ret = ret + item
        })
        return ret
    }
    return inner;
    

}
上一篇

探索浏览器渲染器原理