欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

2020我的面试经历,一套很考察js基础能力的前端面试题(原题直出,附答案解析)

程序员文章站 2022-06-22 14:44: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