手撸实现代码大集合

最近面试经常会问手写代码实现API,我是觉得能够正确的使用就算成功(在合适的场景、知道兼容性、参数意义、原理)。但是面试官也得区分面试者,于是乎手写代码的话还是算个不错的筛子。所以自己在看别人优秀的代码的时候顺手也记录一下。初二老师用两巴掌告诉了一个道理:文言文底下的注释是人家的不是你自己的。自己要学会必须积累。(;д;)

  1. 实现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
    34
    Function.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));
  2. 斐波那锲函数实现

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

感谢您的阅读。 🙏