1. JS 基础
实现bind的polyfill
bind 的作用
- 对于普通函数,绑定 this 指向;
- 对于构造函数,要保证原函数的原型对象上的属性不能丢失;
// 原型链 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
- 接收一个 Promise 实例的数组或具有 Iterator 接口的对象;
- 如果元素不是 Promise 对象,则使用 Promise.resolve 转成 promise 对象;
- 如果全部成功,状态变为 resolved,返回值将将组成一个数组传给回调;
- 如果有一个失败,状态就变为 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 也没写出来;