前端面试题精选

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            }        }    }