- 作者:老汪软件技巧
- 发表时间:2024-08-25 07:02
- 浏览量:
前言
秋招已经差不多开始了,小编我呀前段时间也是陆陆续续的面了许多家的中小公司,投了许多简历今天也是终于约到了一份大厂小米的前端实习面试,这不刚面完就来记录下这次的的面试经历。
一、自我介绍
面试刚开始也是和正常的公司一样,面试官让你简单的做个自我介绍,于是我就框框框的对着面试官一顿输出,相信正在秋招的友友们也已经说过n遍了,已经烂熟于心了吧。这里我就不在叙述了。
二、手写promise
自我介绍完后,面试官也是点头回应了一句后就直接来上一句,那你先手写一下promise吧,果然大厂的面试就是不一样,上来就要我手写,用promise实现让b函数在异步代码a函数执行1000毫秒后执行,我以为他是要我实现一个定时器用promise写,于是我就框框框就是一顿敲
function a() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("a is ok");
resolve(1)
//reject(1)
}, 1000);
});
}
function b() {
console.log("b is ok");
}
a().then(
(res) => {
//console.log(res, "+++");
b();
},
(err) => {
console.log(err, "---");
}
);
我敲完之后他看了看说嗯,还可以,结果来一句,那你直到promise的源码吗,可以手写一下吗?
我:......顿了半天,跟他说嗯,了解过,我试试写写,写了一会也是直接就把promise的源码写了一下,后面的.then的源码倒是没有继续写下去了,面试官看完写完promise的源码后也是没有继续为难我,就说好了,差不多可以,就这样吧,就继续问我下一题了.
关于promise和.then的源码大家可以看看我的这篇文章
面试官:手写下promise和then的源码前言 promise在我们学习javaScript的过程中也是一个非常重要的 - 掘金 ()
三、手画一个三角形
这里面试官是让我用css实现一个三角形,可能没有了解看过这种的题目的小伙伴会无从下手,但是其实用css是可以实现一些简单的像圆和三角形这些几何图形的,实现三角形的方法有很多种,我这里想到的是通过边框来实现三角形。
.box{
border-left:50px solid transparent;
border-right:50px solid transparent;
border-bottom:50px solid #333;
width:0;
height:0;
}
这样一个三角形也就画出来了。
三角形可以用border画出来,首先一个有四个border的div应该是正方形,设置宽高和四个边框如border-left:50px solid #000;
<style>
.box{
border-left:50px solid #000;
border-right:50px solid #333;
border-top:50px solid #666;
border-bottom:50px solid #999;
width:100px;
height:100px;
background-color: #ccc;
}
style>
head>
<body>
<div class="box">div>
body>
然后我们把它的高度和宽度去掉,剩下四个border.如下图:
.box{
border-left:50px solid #000;
border-right:50px solid #333;
border-top:50px solid #666;
border-bottom:50px solid #999;
width:0;
height:0;
}
再把border-top去掉,这样就把上面的区域给裁掉了。
.box{
border-left:50px solid #000;
border-right:50px solid #333;
border-bottom:50px solid #999;
width:0;
height:0;
}
接下来,再让左右两边的border透明,就得到了三角形
.box{
border-left:50px solid transparent;
border-right:50px solid transparent;
border-bottom:50px solid #333;
width:0;
height:0;
}
当然,也还有其他方式也可以实现画一个三角形,像还可以通过使用clip-path,还有使用:before伪元素和使用::after伪元素等,方法还有很多,大家可以自行去了解一下。
四、事件循环机制题目
接下来面试官就给了我一道关于判断事件循环机制的题目让我做,小编对这个也是心有成竹,也是把它做出来了,事件循环机制在面试中是一个非常被容易问到的一个知识点,这里我就不具体跟大家叙述了,大家有不懂的可以看看我之前写的这篇文章。
三道面试题带你了解js事件循环机制前言: 什么是js的事件循环机制呢?JavaScript的事件循环机制(Event L - 掘金 ()
五、手写实现三种水平垂直居中的方法
然后面试官也是问了我一些css布局相关的问题,让我手写出三种实现水平居中的方法。小编我也是立马就写了三种出来
方法一:弹性flex
<style>
.box {
width: 500px;
height: 500px;
background-color: rgb(28, 101, 164);
display: flex;
justify-content: center;
align-items: center;
}
.wrap {
width: 200px;
height: 200px;
background-color: green;
}
style>
head>
<body>
<div class="box">
<div class="wrap">div>
div>
body>
justify-content: center是主轴居中,align-item: center是交叉轴居中
方法二:定位absolute+translate
给top和left分别一个50%,然后自身再top和left负50%
html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
.box {
width: 500px;
height: 500px;
background-color: rgb(28, 101, 164);
position: relative;
}
.wrap {
width: 200px;
height: 200px;
background-color: green;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/* margin-top: -100px; */
/* margin-left: -100px; */
}
style>
head>
<body>
<div class="box">
<div class="wrap">div>
div>
body>
html>html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
<style>
.box {
width: 500px;
height: 500px;
background-color: rgb(28, 101, 164);
position: relative;
}
.wrap {
width: 200px;
height: 200px;
background-color: green;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
/* margin-top: -100px; */
/* margin-left: -100px; */
}
style>
head>
<body>
<div class="box">
<div class="wrap">div>
div>
body>
html>
如果已知宽高的时候也可以不用translate,直接写成margin-left:-100px和margin-top:-100px.
方法三:定位+margin auto
<style>
.father{
width:500px;
height:300px;
border:1px solid #0a3b98;
position: relative;
}
.son{
width:100px;
height:40px;
background: #f0a238;
position: absolute;
top:0;
left:0;
right:0;
bottom:0;
margin:auto;
}
style>
<div class="father">
<div class="son">div>
父级设置为相对定位,子级绝对定位,并且四个定位属性的值都设置了0,那么这时候如果子级没有设置宽高,则会被拉开到和父级一样宽高
这里子元素设置了宽高,所以宽高会按照我们的设置来显示,但是实际上子级的虚拟占位已经撑满了整个父级,这时候再给它一个margin:auto它就可以上下左右都居中了。
六、问了一些简单的js和vue的基础题目
然后就是接着聊了聊一些js和vue的一些知识,具体问的啥我可能也不太记得了,但是都是挺基础的。
七、算法题
最后就是算法题了,我就知道大厂的面试一定少不了算法,果然,问了我一道关于合并重叠的子数组的问题,题目大概意思如下:
合并重叠的子数组,有一个数组包含多个子数组,每个子数组都由不同的时间段[starti,endi]组成,要求合并所有重叠的时间段,返回一个新的二维数组。
输入intervals:一个二维数组,其中每个元素也是一个数组 [start, end] 表示一个时间段,start 和 end 均为整数,且满足 start