有趣的前端面试题
尽管我不喜欢这种方式考察前端能力,但恐怕不是面试也遇不到,还是记录下,感觉工作一年的时候遇到这些问题会答的更好。
1
选择题
一批图书数量在 2500 到 3000 之间,每所希望小学发 24 本剩余 0 本,每所希望小学发 28 本剩余 0 本,每所希望小学发 32 本剩余 0 本,问这批图书有多少本。
for (let i = 2500; i < 3000; i++) {
if (i % 24 == 0 && i % 28 == 0 && i % 32 == 0) {
console.log(i);
break;
}
}
答案 2688,数学上就是算出最小公倍数然后乘 2 即可。但在计算机上好像除了穷举法没什么更好的吧。
2
第二题就是下面这段话的拆分,然后选出顺序,因为我搜到了原文
网络投票,本来是为了让更多的人参与,让各种投票评选活动公开,不过,越发扩大的投票范围,使得网络投票已然变味。而网络投票又衍生了很多刷票软件,“投票达人”“投票大王”“投票大师”等刷票软件,都属于有偿使用的工具。当有人利用投票活动牟利,或者为了获奖而刷票、拉票时,不仅形成一种失信行为,还会造成互相比拼的恶性竞争,践踏了公平底线。网络评选投票的背后,是已然失去控制的检查评比现象。
3
选择题,这题我做的时候没算出来,随便蒙的,
销售一部手机,按照原地价格的先降价 200 再打九折最终售价为 1170,此时仍可获得 14%的利润,按照原定价销售可获得利润为。
这题最骚的是 14 它不是整除,原价 1500 我算出来了,然后就直接 1500 除 1170 乘 0.14,其实还要算出原价 1026,最后是 0.4619
let price = 0,
originPrice = 0,
currenPrice = 1170;
for (let i = 201; i < 3000; i++) {
if ((i - 200) * 0.9 === currenPrice) {
price = i;
break;
}
}
for (let i = 3000; i > 200; i--) {
if ((currenPrice - i) / i >= 0.14) {
originPrice = i;
break;
}
}
console.log((price - originPrice) / originPrice);
4
选择题
甲乙三数之和是 197,乙除以甲商 3 余 1,丙除乙商 3 余 1,问甲和丙的和,
const maxNum = 187;
for (let a = 0; a < maxNum; a++) {
for (let b = 0; b < maxNum; b++) {
for (let c = 0; c < maxNum; c++) {
if (
a + b + c === maxNum &&
c % b == 1 &&
((c / b) | 0) == 3 &&
b % a == 1 &&
((b / a) | 0) == 3
) {
console.log(a + c);
break;
}
}
}
}
答案 144,其实我当时的想法也是对,设甲是 x,乙就是 3x+1,丙就是 9x+4。但是粗心了些,后来就自己找数带了。
5
选择题
全班平均成绩 85.3,小明发现在自己考了 87 分但老师等级的 77,重新计算后平均分为 85.5,这个班有多少人。
for (let i = 0; i < 100; i++) {
if (85.3 * i + 87 - 77 == 85.5 * i) {
console.log(i);
break;
}
}
50,这种反而用数学更简单
6
选择题
事件传播的三个阶段,答案是捕获>目标>冒泡,我理解 addEvenListener 的第二个参数不是可以决定事件在哪个阶段触发,还自作聪明的发现没有强调是单项选择,因次选了目标>捕获>冒泡,目标>冒泡>捕获,蜜汁操作。
7
选择题
null instanceof object 是 false,我记成了 true, null 都没有原型链,蜜汁操作
8
选择题 {a:'one',b:"two",a:"three"},问 console.log 输出结果是什么,正确答案是{a:'three',b:"two"}
我记成了 {b:"two",a:"three"},蜜汁操作
9
http 中 head 请求方法作用,忘记了,其实和 get 一样,只不过不返回请求体,比如判断某个资源是否存在,语义化更明确。
10
function Foo() {
getName = function () {
console.log(5);
};
return this;
}
Foo.getName = function () {
console.log(4);
};
Foo.prototype.getName = function () {
console.log(3);
};
var getName = function () {
console.log(2);
};
function getName() {
console.log(1);
}
Foo.getName();//4
getName();//2
Foo().getName();//5
getName();//5
new Foo.getName();//4
new Foo().getName();//3
new new Foo().getName();//3
后两个当时犹豫了,一直在想执行流程是啥,其实第六个没啥好犹豫的。
第一个没啥悬念
第二个是因为 function getName 存在变量提示,然后被 var getName = function ()覆盖,
第三个先执行 Foo,默认是 windows 作用域,里面再一次覆盖 getName,所以第四个也是 5
第五个先执行 Foo.getName() 在 new,输出返回结果是 Foo.getName {}
第六个先执行 new Foo()再 getName(),调用到 Foo.prototype.getName
第七个相当于 new (new Foo().getName()),调用到 Foo.prototype.getName 是 3,输出返回时Foo.getName {}