面试笔试题总结

123 阅读1分钟

前言

  1. 最近邀约笔试收集到几个比较有意思的题目可以跟大家分享下
  2. 基础知识涵盖比较全(很基础)

简易计算器实现

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