转载自奇舞周刊微信公众号,https://mp.weixin.qq.com/s/YQlJ2Ey7Ha9hcs_BkvrB3w
看完觉得还不够,手动敲一敲加深记忆………
节流和防抖
节流和防抖是前端的一个高频面试题,概念糊弄不清的话面试中很容易出错。
节流和防抖的作用都是防止函数多次调用。区别在于,假设用户一直触发这个函数,防抖的作用是如果函数触发间隔小于wait,防抖的情况只会调用一次函数,而节流的情况是每隔一定时间wait,调用一次函数。
节流的简单实现:
1 | function throttle(fn, threshhold) { |
防抖的简单实现:
1 | function debounce(fn, inteval) { |
Call, apply, bind 的js实现
call
,apply
是JavaScript中很重要的概念,也是面试中的高频考点。不光是要了解其特点、用法,还要理解他们是怎么实现的。
call
的简单实现
1 | Function.prototype.call = function(cxt, ...args) { |
apply
的简单实现
1 | Function.prototype.apply = function(ctx, args) { |
关于call,apply的模拟实现更细节的讲解可以查看 https://github.com/mqyqingfeng/Blog/issues/11
bind
的简单实现
1 | Function.prototype.bind = function(obj) { |
关于call
,apply
,bind
方法的详细介绍参考这篇文章https://mp.weixin.qq.com/s/DlUJq0JJzHjnPwCI_SAI5Q
new
的实现
new
做了什么:
- 创建一个全新的对象。
- 这个对象会被执行
[[prototype]]
(也就是proto)链接。 - 生成的新对象对绑定到函数调用的
this
。 - 通过
new
创建的每个对象将最终被[[prototype]]
链接到这个函数的prototype
对象上。 - 如果函数没有返回对象类型object(包含function,array,date,regexg,error),那么new表达式中的函数调用会自定返回这个新的对象。
1 | function newOps(ctor) { |
函数柯里化
1 | function currying(fn) { |
斐波拉切数列
R1
1
2
3
4
5
6function fib(n) {
if (n===0 || n===1) {
return n
}
return fib(n-2) + fib(n-1)
}R2
1
2
3
4
5
6
7
8
9
10
11
12
13function Fibonacci(n) {
if(n<=1) {
return n;
} else{
var f0=0;f1=1
for(var i=2;i<=n;i++) {
f2=f0+f1;
f0=f1;
f1=f2;
}
return f2;
}
}