2020我的面试经历,一套很考察js基础能力的前端面试题(原题直出,附答案解析)
程序员文章站
2022-03-13 14:33:53
魔幻的2020,注定是大家人生中难忘的一年。之前听说工作难找,但没想到如此艰难。职位变少了,要求变高了,招聘周期变长了,每个环节的改变都是对自己面试心态的一个挑战,扛下来可能会找到一份过得去的工作,看不住也就只能将就了。以下是我众多面试公司中比较有代表性的一家,试题整体很考察js基础能力,我把题目记录下来,部分题目做了答案解析,希望对大家找工作有所帮助。//题目一:考察setTimeout在for中的执行顺序let i;for(i=0;i<3;i++){ let log = ()=...
魔幻的2020,注定是大家人生中难忘的一年。之前听说工作难找,但没想到如此艰难。职位变少了,要求变高了,招聘周期变长了,每个环节的改变都是对自己面试心态的一个挑战,扛下来可能会找到一份过得去的工作,看不住也就只能将就了。
以下是我众多面试公司中比较有代表性的一家,试题整体很考察js基础能力,我把题目记录下来,部分题目做了答案解析,希望对大家找工作有所帮助。
//题目一:考察setTimeout在for中的执行顺序
let i;
for(i=0;i<3;i++){
let log = ()=>{console.log(i)}
setTimeout(log,0);
}
function demo(){
let x = b = 0;
return x
}
demo()
console.log(typeof x)
console.log(typeof b)
//题目二:考察with的使用,与with相关的变量提升问题
let sender = {
a:1,
c:undefined
}
function demo1(){
with(sender){
a = 2
b = 3
c = 4
}
}
demo1()
console.log(sender)
function demo2(str){
eval(str)
console.log(x)
}
var x = 1
demo2("var x = 3")
console.log(x)
//题目三:考察数组类型转换
var a = {}
var b = {key:'b'}
var c = {key:'c'}
var d = [3,5,6];
a[b] = 123;
a[c] = 345;
a[d] = 333;
console.log(a[b]);
console.log(a[c]);
console.log(a[d]);
解析:
a[b] => a['Object object']
a[c] => a['Object object']
a[d] => a['3,5,6']
//题目四:
new Promise(res=>{
setTimeout(()=>{console.log(0)},0) //宏1
res() //微1
}).then(()=>{setTimeout(()=>{console.log(1)},0)}) //宏6
setTimeout(()=>{console.log(2)},0) //宏2
new Promise(res => setTimeout(res,0)).then(()=>{ // 宏3
console.log(3)
setTimeout(()=>{console.log(4)},0) //宏7
new Promise(r => r()).then(()=>{console.log(5)}) //微3
})
setTimeout(()=>{console.log(6)},0) //宏4
new Promise(res=>res()).then(()=>{ //微2
console.log(7)
})
for(var i=8;i<11;i++){
setTimeout(()=>{console.log(i)},0) //宏5
console.log(i)
}
结果:
8
9
10
7
0
2
3
5
6
11 11 11
1
4
解析:
promise中遇到res(),resolve()就为微任务,放到事件队列里头去,待主线程全部执行完再开始任务队列处理(事件队列按照微任务,宏任务的顺序执行)
//题目五:
function Foo(){
getName = function(){alert(1);};
return this
}
getName() //==> 输出5
Foo.getName = function(){alert(2);};
Foo.prototype.getName = function(){alert(3);};
var getName = function(){alert(4);};
function getName(){alert(5);};
biz(); //==> 输出8
function biz(){alert(8);}
if([]==false){
function biz(){alert(6);}
}else{
function biz(){alert(7);}
}
请写出输出结果:
biz();
Foo.getName();
getName();
Foo().getName();
getName();
Foo.getName();
new Foo.getName();
结果:
6
2
4
1
1
2
2
解析:
biz() 第二次运行是走if的;
getName()执行的是window.getName()
//题目六:
现在有随机位随机整数数组,例如[2,11,20,160,3,1,-89,......]请挑选出数组内三个随机整数和为100的所有数据。请写出实现。
解析:leetcode的15题,求三数之和。https://leetcode-cn.com/problems/3sum/
大概的思路就是第一层用哈希表的形式记录每个数map[key](当成key),其对应的值为100-map[key]。
第二层再用for去比较剩余两个数的和与map[key]是否相等。相等则记录下来当前三个数(一组或多组)
//题目七:
调用数组方法和Math.random()在一条语句的情况下,实现生成给定位数的随机数组,例如生成10位随机数组[1,1,102,1,2,3,8,4,90,8,123,11,123]数组内数字随机生成
解析:
方案一:new Array(10).fill('').map((item)=>Math.random())
方案二:Array.from('0123456789').map((item)=>Math.random())
......
//题目八:
实现一个bind方法,例如
let n = function (a,b,c,d) {
console.log(this.x,a,b,c,d)
}
let m = {x:3}
let fn = n.bind(m,1,3)
fn(5,8) //打印 3 1 3 5 8
//题目九:
实现一个setter方法,例如
let setter = function (content,key,value) {
}
let n = {
a:{
b:{
c:{d:1},
bx:{y:1}
}
}
} //修改值setter(n,'a.b.c.d',3)
console.log(n.a.b.c.d) //打印3
setter(n,'a.b.bx',1)
console.log(n.a.b.bx) //打印1
解析:递归方式实现,注意递归的条件和最后结束类型的判断等。
如果有写的不好的欢迎指正和给出建议。
后续还会更新关于其他面试方面的文章,敬请期待…
本文地址:https://blog.csdn.net/ssza02/article/details/108184327