JS手写相关

54 阅读1分钟
  • 阶乘

function jie(num) {
    if (num <= 1) {
        return 1
    } else {
        return num * jie(num - 1)
    }
}
  • 解析URL

function kUrl(str){
    let al = str.split("?")
    let objUrl={};
    console.log(al)
    let url = al[0]
    let kv = al[1].split("&")
    console.log(url)
    console.log("键值对" + kv)
    for (let i = 0; i < kv.length; i++) {
        objUrl[kv[i].split("=")[0]] = kv[i].split("=")[1]
    }
        return objUrl;
}
    let hu = "https://www.nowcoder.com/interview/center?anchor=companyExp&entranceType=%E7%99%BB%E5%BD%95%E9%A6%96%E9%A1%B5";
    console.log(kUrl(hu))
  • 手写instaceof

function myInstanceof(left,right){
    //获取(构造)函数的(显式)原型
    let rp = right.prototype;
    //获取对象的(隐式)原型
    left = left.__proto__;
    //判断对象的(隐式)原型是否等于(构造)函数的(显式)原型
    while(true){
        if(left === null){
            return false
        }
        if(left === rp){
            return true
        }
        left = left.__proto__
    }
}
  • 浅拷贝

function shallowCopy(object) {
    //只拷贝对象
    if (!object || typeof object !== "object") return;
    //根据object的类型判断是新建一个数组还是对象
    let newObject = Array.isArray(object) ? [] : {};
    //遍历object,并且判断是object的属性才拷贝
    for (let key in object) {
        if (object.hasOwnProperty(key)) {
            newObject[key] = object[key];
        }
    }
    return newObject;
}
  • 深拷贝

function deepCopy(object) {
    if (!object || typeof object != 'object') return;
    let newObject = Array.isArray(object) ? [] : {}
    for (const objectKey in object) {
        if (object.hasOwnProperty(objectKey)) {
            newObject[objectKey] = typeof object[objectKey] === 'object' ? deepCopy(object[objectKey]) : object[objectKey]
        }
    }
}
  • 手写call

Function.prototype.myCall = function(context = window){ //myCall函数的参数,没有传参默认是指向window
    context.fn = this //为对象添加方法(this指向调用myCall的函数)
    let args = [...arguments].slice(1) // 剩余的参数
    let res = context.fn(...args)  // 调用该方法,该方法this指向context
    delete context.fn //删除添加的方法
    return res
}
  • 手写拍平

function flatten(arr){
    let newArr=[];
    for (let i = 0; i < arr.length; i++) {
        if (Array.isArray(arr[i])){
            newArr= newArr.concat(flatten(arr[i]))
        }else{
            newArr.push(arr[i])
        }
    }
    return newArr;
}
  • 防抖基础版

export const fangdou=(fn, delay)=> {
    let timer = null;
    return function () {
        if (timer !== null) {
            clearTimeout(timer);
        }
        timer = setTimeout(() => {
            // 箭头函数没有自己的this,改变指向,使其指向input。同时执行fn函数
            fn.call(this);
        }, 2000);
    };
}
  • 节流基础版

function jieliu(fn,delay){
    let start = 0;
    return function(){
        let now =  new Date().getTime();
        if (now-start<delay)return;
        fn();
        start= now;
    }
}
  • 手写Promise.all

function  all(promises){
    let length = promises.length;
    // 记录每个promise成功时结果,同时用于返回
    let arr = [];
    return new Promise((resolve, reject) => {
        for (let i = 0; i < length; i++) {
            promises[i].then(
                res => {
                    arr[i] = res;
                    if (arr.length === length) {
                        resolve(arr);
                    }
                },
                rej => {
                    reject(rej);
                }
            );
        }
    });
}