乐趣区

面试题精选

前端面试题精选

1.memorize 函数实现应用

首先什么是 memorize 函数,memorize 直译:记忆,缓存等意思,到了计算机层面就翻译为缓存函数,缓存函数就是把计算的结果,存在函数中,当再次调用的时候就可以直接调用。这种方法就是用空间来换取时间

    const memorize = function(fn) {const cache = {}
        return function(...args) { // 参数值,是一个数组,数组的值是需要计算的值
            const _args = JSON.stringify(args)
            return cache[_args] || (cache[_args] = fn.apply(fn, args)) 
            // 缓存函数的核心判断依据,传入的键名对应的键值为 null 则调用 add 方法 反之从 cache 中拿取
        }
    }
    const add = function(a) {return a + 1}
    const adder = memorize(add) // memorize 只调用一次 后面 adder 调用的都是 return 的函数
    adder(1) // 2    cache: {'[1]': 2 }
    adder(1) // 2    cache: {'[1]': 2 }
    adder(2) // 3    cache: {'[1]': 2, '[2]': 3 }

2. bind,apply,call 的区别和实现

javascript 权威指南上的解释是:call()、apply()可以看做是某个对象的方法,通过调用方法的形式来间接调用函数。bind()就是将某个函数绑定到某个对象上。

    var obj = {x:1}
    function foo() {console.log(this.x)
    }
    foo.call(obj)  //1

call()和 apply()的第一个参数相同,就是指定对象,他们的根本区别就在于传入的参数。
call 传入参数形式为 call(obj, 1, 2, 3)
apply 传入参数形式为 apply(obj, [1,2,3])

bind()方法和前两者不同在于:bind()方法会返回执行上下文被改变的函数,而不会立即执行 ,而前两者是 直接执行该函数 。他的参数和 call() 相同.

3. 数组去重

去重方法有很多种,常用必需会写的几种去重方法有

1. 遍历去重
2. json 键名不唯一去重
3. new Set()去重

3.1 遍历去重

    let arr = [1, 2, 3, 4, 5, 6, 7, 7, 7, 3, 111, 1, 3]

    for (let i = 0; i < arr.length; i++) {for (let j = i + 1; j < arr.length; j++) {if (arr[i] == arr[j]) {arr.splice(j, 1)
                i = i - 1
            }
        }
    }
退出移动版