手写题总结

1、防抖:在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

function debounce(fn, delay) {
    var timer; // 维护一个 timer
    return function () {
        var _this = this; // 取debounce执行作用域的this
        var args = arguments;
        if (timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(function () {
            fn.apply(_this, args); // 用apply指向调用debounce的对象,相当于_this.fn(args);
        }, delay);
    };
}

2、节流:事件在n秒内只触发一次,如果n秒内又被触发,只有一次生效。

function throttle(fn, delay) {
    var previous = 0;
    // 使用闭包返回一个函数并且用到闭包函数外面的变量previous
    return function() {
        var _this = this;
        var args = arguments;
        var now = new Date();
        if(now - previous > delay) {
            fn.apply(_this, args);
            previous = now;
        }
    }
}

1
3、浅拷贝

function clone(target) {
    let cloneTarget = {};
    for (const key in target) {
        cloneTarget[key] = target[key];
    }
    return cloneTarget;
};

4、深拷贝

function clone(target, map = new Map()) {
    if (typeof target === 'object') {
        let cloneTarget = Array.isArray(target) ? [] : {};
        if (map.get(target)) { // 解决循环引用
            return map.get(target);
        }
        map.set(target, cloneTarget);
        for (const key in target) {
            cloneTarget[key] = clone(target[key], map);
        }
        return cloneTarget;
    } else {
        return target;
    }
};

5、快排:1.在待排序的元素任取一个元素作为基准。2.将待排序的元素进行分块,比基准元素大的元素移动到基准元素的右侧,比基准元素小的移动到作左侧。3.对左右两个分块重复以上步骤直到所有元素都是有序的(递归过程)

 function quick(arr) {
            if (arr.length <= 1) {
                return arr;
            }
            var rightArr = []
            var leftArr = []
            var centerIndex = Math.floor((arr.length) / 2)
            var centerValue = arr.splice(centerIndex, 1)[0]

            for (var i = 0; i < arr.length; i++) {
                if (arr[i] < centerValue) {
                    leftArr.push(arr[i])
                } else {
                    rightArr.push(arr[i])
                }
            }
            var result = quick(leftArr).concat(centerValue).concat(quick(rightArr))
            return result;
        }

6、插入排序:将第一个元素看做一个有序序列,其他作为未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。

        function insert(ary) {
            var handAry = [];
            handAry.push(ary[0])
            for (var i = 1; i < ary.length; i++) {
                var item = ary[i];
                for (var j = handAry.length - 1; j >= 0; j--) {
                    if (item > handAry[j]) {
                        handAry.splice(j + 1, 0, item);
                        break;
                    }
                    if (j === 0) {
                        handAry.unshift(item)
                    }
                }
            }
            return handAry;
        }

你可能感兴趣的:(javascript)