最近面试经常会问手写代码实现API,我是觉得能够正确的
使用就算成功(在合适的场景、知道兼容性、参数意义、原理)。但是面试官也得区分面试者,于是乎手写代码的话还是算个不错的筛子。所以自己在看别人优秀的代码的时候顺手也记录一下。初二老师用两巴掌告诉了一个道理:文言文底下的注释是人家的不是你自己的。自己要学会必须积累。(;д;)
实现Call
代码来源:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34Function.prototype.call2 = function (context) {
var context = context || window;
context.fn = this;
var args = [];
for(var i = 1, len = arguments.length; i < len; i++) {
args.push('arguments[' + i + ']');
}
var result = eval('context.fn(' + args +')');
delete context.fn
return result;
}
// 测试一下
var value = 2;
var obj = {
value: 1
}
function bar(name, age) {
console.log(this.value);
return {
value: this.value,
name: name,
age: age
}
}
bar.call2(null); // 2
console.log(bar.call2(obj, 'kevin', 18));斐波那锲函数实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19// 递归实现
function fibonacci(n, ac1 = 1, ac2 = 2) {
if(n <= 1){
return ac2
}
return fibonacci(n-1, ac2,ac1 +ac2)
}
// generator
function* fibonacci () {
let [prev, curr] = [0, 1]
for(;;){
yield curr
[prev, curr] = [curr, prev + curr]
}
}
for(let n of fibonacci()){
if(n > 1000) break
console.log(n)
}