前端面试题精选
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 } } }