前言
- 最近邀约笔试收集到几个比较有意思的题目可以跟大家分享下
- 基础知识涵盖比较全(很基础)
简易计算器实现
calculator(1) ===> 1
calculator(1).add(3) ===> 4
calculator(1).add(3).div(2) ===> 2
分析
1. 开始我会想到以一个类的形式去封装抽离出来像这样
class Calculator {
constructor(n) {
this.result = n;
}
add(a) {
this.result += a;
return this;
}
div(d) {
this.result = this.result / d;
return this;
}
}
const res = new Calculator(1).add(3).div(2).result;
console.log('res', res);
这种实现方式固然大体完成了上面的要求,但是很明显是不完美的,而且给计算过程增加了繁琐的其他步骤,不纯粹
2. 第二种基于原型链封装
function calculator(n) {
let result;
if (typeof n !== 'number') return;
result = n;
return result;
}
Number.prototype.add = function (n) {
return n + this;
};
Number.prototype.div = function (n) {
return this / n;
};
const finalResult = calculator(1).add(3).div(2);
console.log('finalResult', finalResult);
数组加强题
题目是这样的
class Cls extends Array {
sum() {
return this.reduce((cur, prev) => cur + prev, 0);
}
}
const cls = new Cls(3)
cls.sum()是否正确,如果正确结果是多少
ok,不卖关子 答案是正确,结果为0
我想从这个题目延伸几个问题
const a = Array(3)
1. a.length 是多少? 如果正确结果是多少
2. a.sum() 正确与否?如果正确结果是多少
3. [...new Cls(3)].map((_,index) => index).sum() 正确与否?如果正确结果是多少
4. Cls(3).fill(1).sum() 正确与否?如果正确结果是多少
5. Cls.of(3).sum() 正确与否,如果正确结果是多少
分析
1. a.length 长度为3 // a === [empty * 3]
2. 报错 原型链上没有这个方法
3. 报错 同2
4. 正确 结果为3
5. 正确 结果为3