【滴滴日常实习-1轮面经】
滴滴一轮面试,本来应该是线下面试的,题主出差刚回来,又熬了几天夜(苦逼土木人),就选择了线上面试。面试官是个小姐姐,说话很和气,问的问题都比较友好,并且都是按照简历内容信手拈来地提问。
吹水部分
1. 介绍一下自己?
css部分
1. 居中是怎么实现的?
关于水平和垂直方向的布局规则,可以参考我这篇博文:CSS中彻底搞懂盒模型、定位
- 水平居中:
- 【行内元素】:
text-align : center;
- 【块元素】:确定了大小的块元素用
margin:0 auto;
- 【开启了绝对定位且知道元素宽度】:left:50% + margin-left: 负一半的width。举个一目了然的例子:
- 【行内元素】:
<style>
#box {
background-color: #bfa;
width: 400px;
height: 400px;
margin: 0 auto;
padding: relative;
}
#inner-box {
background-color: blue;
width: 200px;
height: 200px;
position: absolute;
left:50%;
/*往回拉一半的宽度*/
margin-left:-100px;
}
</style>
</head>
<body>
<div id="box">
<div id="inner-box">
</div>
</div>
</body>
- 【开启了绝对定位且元素宽度不确定的】:left:50% + transform:translateX(-50%);。
<style>
#box {
background-color: #bfa;
width: 400px;
height: 400px;
margin: 0 auto;
padding: relative;
}
#inner-box {
background-color: blue;
width: 200px;
height: 200px;
position: absolute;
left:50%;
/*往回拉一半的宽度*/
transform:translateX(-50%);
}
</style>
- 垂直居中:
- 【行内元素】:
line-height 当于父元素 height ;
- 【开启了绝对定位且知道元素宽度】:top:50% + margin-top: 负一半的height。
- 【开启了绝对定位且元素高度不确定的】:left:50% + transform:translateY(-50%);。
- 【行内元素】:
2. position有哪几种类型?static,relative,absolute,sitcky,fixed
。
position:relative和absolute有什么区别?
参考下 这篇博客
首先, 在正常流中的位置存在与否。
其次,relative定位的层总是相对于其最近的父元素,无论其父元素是何种定位方式。相对于static定位以外的第一个父元素进行定位。
3. css预处理器用过吗?
讲了一些less的特性,sass没用过。
4. 做过移动端适配吗?
感觉是前端必问问题。我扯了一些rem,媒体查询,vm/vh之类的。
js部分
1. js有哪几种变量类型?
2. 如何变量类型判断?
3. 深拷贝和浅拷贝?
这里我提了用JSON序列化再反序列化,即JSON.parse(JSON.stringify(obj))
,以及自己手写递归深拷贝,面试官问我这两种方法能不能拷贝对象的函数属性?我说第一种肯定不行,第二种自己手写的可以。
关于深拷贝这篇文章写的很好
4. let和const与var的区别? const声明的对象的属性可以修改吗?
这篇博客写的很简洁
框架部分
- vue 生命周期函数说一下?
v-if
切换是从哪个生命周期函数开始的?
这块问到v-if
的时候博主不会了,因为vue写的不多,以后要加强学习。
答案在这里
针对做的项目部分
1. nginx 反向代理配置,用什么语法实现本地跨域联调的?
2. 博客项目的前端是原生js写的还是框架?后端呢?是怎么用JS访问mysql数据库的? 数据库为什么要用mysql,有没有了解过其他类型的数据库?
前端和后端都是原生JS写的(美其名曰为了更好地理解机制)。博主用的是const mysql = require('mysql')
来访问mysql的。数据库博主只用过关联式的数据库mysql,mongoDB听说过,没有用过。
3. 博客登录为什么要用redis储存session来实现验证用户登录? 尝试过直接把用户信息储存在内存里吗?这样做有什么缺点?
(1) 用户名信息直接暴露在HTTP请求里很危险,容易被人抓包;
(2) session访问频繁,对性能要求更高,redis用内存来做存储,比sql效率要高很多。
(3) 至于断电丢失不好恢复的问题,可以不用太多考虑,最差的情况让用户再登录一次就是了。
(4) 相比于mysql中存的大数据,session存的是轻量化的id和用户名,所以不会有太多储存负担。
为什么不把登录信息直接存到node进程内存里?
(1) 进程内存有限,如果访问量过大,溢出了,服务器可能就5xx了。
(2) 服务器正式上线都是多进程,进程之间的内存是无法共享的,因为登录信息会被分割成一个个孤岛,无法相互访问。
代码考察部分
1. 爬*(一道easy题目)
LeetCode爬*
这里博主拉跨了,用的没有记忆化搜索的DFS…问到时间复杂度的时候还不是很确定…
面试完试了一下,写的代码在LeetCode上只能通过一半的测试用例。关键是3个月前我还用DP提交过这题。
2. JS数组去重。
这里博主也拉跨了,因为没用JS刷题,用的C++,所以JS的Array的API都不太会用…好在最后勉强写出来了…
答案在这里
以上,希望能帮助到你。
上一篇: 前端常见面试题2019(二)
下一篇: 好未来前端面试