1. JS 基础

实现bind的polyfill

bind 的作用

  1. 对于普通函数,绑定 this 指向;
  2. 对于构造函数,要保证原函数的原型对象上的属性不能丢失;
// 原型链
Function.prototype.bind = function(obj, ...args) {
    if(typeof this !== 'function'){
        throw new Error('调用 bind 方法的不是函数!');
    }
    var boundArgs = args;
    var self = this;
    var fBound = function(...args){
        let realObj = this instanceof fBound ? this : obj;
        self.apply(obj, boundArgs.concat(args));
    }
    Object.setPrototypeOf(fBound, this.prototype);
    return fBound;
}

2. 算法题

双行道
有一个2*n的网格,有一个人位于(1,1)的位置,即左上角,他希望从左上角走到右下角,即(2,n)的位置。在每一次,他可以进行三种操作中的一种:
1.    向右走一格,即从(x,y)到(x,y+1);
2.    向上右方走一格,即,如果他在(2,y)的位置可以走到(1,y+1);
3.    向下右方走一格,即,如果他在(1,y)的位置可以走到(2,y+1);

问题当然不会这么简单,在这2*n的格子中,有一部分格子上有障碍物,他不能停在障碍物上,当然也不能走出网格,请问他有多少种不同的路线可以到达(2,n)。
输入描述
输入第一行仅包含一个正整数n,表示网格的长度。(1<=n<=50)
接下来有2行,每行有n个字符,“X”代表障碍物,“.”代表可以停留。
输出描述
如果没有可以到达的路线则输出-1,否则输出方案数量。
输入
5
..X.X
XX...
输出
2

3. 算法题

寻找峰值
限定语言:C、Python、C++、Javascript、Python 3、Java、Go
山峰元素是指其值大于或等于左右相邻值的元素。给定一个输入数组nums,任意两个相邻元素值不相等,数组可能包含多个山峰。找到索引最大的那个山峰元素并返回其索引。

假设 nums[-1] = nums[n] = -∞。
输入
[2,4,1,2,7,8,4]
输出
5

JS 基础

实现 Promise.all

  1. 接收一个 Promise 实例的数组或具有 Iterator 接口的对象;
  2. 如果元素不是 Promise 对象,则使用 Promise.resolve 转成 promise 对象;
  3. 如果全部成功,状态变为 resolved,返回值将将组成一个数组传给回调;
  4. 如果有一个失败,状态就变为 rejected,返回值将直接传递给回调 all() 的返回值也是新的 Promise 对象;
function promiseAll(promiseArr){
    return new Promise((resolve, reject) => {
        let len = promiseArr.length;
        let datas = new Array(len);
        if(len === 0){
            resolve(datas);
        }
        for(let i = 0; i < promiseArr.length; i++){
            (function(i){
                Promise.resolve(promiseArr[i])
                .then(data => {
                    datas[i] = data;
                    if(i === len - 1){
                        resolve(datas);
                    }
                }, err => {
                    reject(err);
                })
            })(i)
        }
    });
}

复盘

迷宫那道算法题我应该直接用回溯做的,不应该耍小聪明,自以为想到了一个写起来代码最少的方法,回溯怕写错,结果直接崩了。

JS 基础太差了,bind 写不出来, Promise.all 也没写出来;