前端面试100问!!

面试造火箭,工作拧螺丝!

在技术圈毕竟只有百分之一的人能进入BAT,百分之九九的小伙伴只能在普通公司做这普通的事情,厌烦哪些标题党,我们抛开那些高大上的台词,回归到面试的本质。
本课程帮助小伙伴们快速梳理知识,不会涉及到具体的很细节的知识点,关注面试本身。
公司一般会从以下5个方面考察一个人的能力,本课程的100问是总结了最近2-3年常问的面试题,适合初中级前端工程师。

1、HTML(5)和CSS3方面

1.前端与后端数据交互的格式有哪些,为什么大部分现在都用json而不用xml。
答:XML:知了堂3岁
JSON:{ name:”知了哥”,age:3}
JSON书写方便节省字节,更轻量,前后台都有直接解析JSON的方法(JSON.stringfity/parse)使用方便。

2.Flex布局熟悉吗,说几个常用的属性。

答:这个几乎每天都在用,还是挺熟悉的。
display:flex
align-items 多个
align-content:单个
justify-content
justify-items
flex-direction
flex-wrap:
flex-basic:初始盒子宽度 flex
flex-grow:增长因子 200 440=160 1,1,1,2 1/540 flex
flex-shrink :缩减因子 200 60*4=240

3.说一下CSS盒模型

答:CSS的盒模型包含了一下几个内容margin,padding,border,content。
在计算盒子宽高的时候,IE和Chrome会有一些区别,IE算到border,Chrome的宽度只包含content区域,因此CSS3提供了box-sizing这个属性来修改。

4.CSS常用选择器,选择器权重问题。

答:*(has,not,target,root。。。。)通配符, ID,class,attr属性,element,子代( > + ~ ),
UI状态伪类选择器(hover,active,link,seceted…,checked),
结构性伪类选择器(nth-child,fist-child,last,nth-of-type…before,after…)

  !important > style > id > class > elemnet > 伪类和属性

5.请用5种方式实现元素垂直居中。

答:1、flex

2、Tranform

3、定位+margin负值(知道子节点宽高)

4、定位+margin:auto

5、JS动态计算top、left值

6.什么是BFC?垂直margin重叠是为什么?怎么解决这个问题?

答:概念:BFC全称Block Formatting Context ,中文意思为块级格式上下文。
通俗的来说:BFC是一个独立的布局环境,我们可以理解为一个箱子(实际上是看不见摸不着的),箱子内部的元素无论如何翻江倒海,都不会影响到外部。转换为BFC的理解则是:BFC中的元素的布局是不受外界的影响(我们往往利用这个特性来消除浮动元素对其非浮动的兄弟元素和其子元素带来的影响。比如清除浮动)并且在一个BFC中,块元素与行元素都会垂直的沿着其父元素的边框排列。

如何触发 BFC

1.浮动元素,float 除 none 以外的值
2.position的值不为static或者relative
3.display不为none
4.overflow 除了 visible 以外的值

BFC的应用

1.解决浮动塌陷问题
2.自适应两栏布局(我们还可以运用BFC可以阻止元素被浮动元素覆盖的特性来实现自适应两栏布局。方法:给没有浮动的元素加overflow:hidden。)
3.解决设置margin值重叠问题。

总结:BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。它规定了元素与其他元素的关系和相互作用。

7.什么是浮动,有什么作用,有何副作用,以及如何清除浮动?

答:浮动是使用给节点添加float属性,最初的设计是用来实现文字环绕的。
添加了float的节点脱离文档流,同时触发节点的BFC,让节点往一个方向靠,并排成一行。
当一个父节点的子节点全部浮动,就会造成父节点高度塌陷,
解决的办法首先是可以给父节点主动添加高度值,再者利用只要有一个子节点不浮动原理来添加一个不浮动的节点(通常使用伪元素before,after),再者还可以触发父节点的bfc,常用的定位,或者overflow:hidden。

8.CSS里面有哪些相对单位?都是相对什么的?

答:REM,EM,VW,VH等
REM:相对于根节点html的font-size
EM:父节点的font-size
VW:视口的宽度为 100VW,相对于把视口分为100份。
VH:视口高度为100VH,同理

以上单位都可以在移动端做页面适配,但通常使用REM和VW

9.fixed是相对于谁定位的?如果加上transform会出现问题吗?

答:fixed定位相对于浏览器视口来定位的
添加上transform以后,fixed定位会失效(现在这个bug已经不存在啦!
)。如果fixed元素的祖先有transform属性,则fixed元素会相对与这个祖先计算,而不是视口(问题还在)。

10.为什么不推荐用style内联元素?内联元素有什么缺点?(css文件可以缓存)

答:首先是style是节点的属性,不能被缓存;代码的可读性和可维护性相对弱一些,特别是多人协作开发的时候。但是如果一个页面的style样式足够少的时候,可以使用style元素,因为一次请求最多携带14K的数据,如果足够小,还可以节约一次请求。

11.简单描述http或https协议,以及为什么要三次握手?什么是长链接

答:http(https)是超文本传输协议,基于TCP请求与相应的模式,无状态的,是目前主流的web传输协议。一般包含请求头,请求体,响应头等
目前http协议已经发展到2.0阶段,支持长链接Connection: keep-alive,断点续传,cache 缓存策略,多路复用,服务器推送等。
https相对于http更安全,增加了证书SSL加密,端口是433。

三次握手其实就是三次网络连接,客户端携带SYN=1,Seq = x信息给服务端,服务端接受到后,服务端就知道了,有一个客户端要链接我,然后服务器就会开启一个TCP socket的端口,然后返回数据给前端也是SYN=1,SEQ=Y,ACK = x+1,客户端接受到后,在发一个seq,和ACK+1.主要是为了防止开启无用的链接,或者网络延迟丢包,服务器无法确定到底客户端有没有收到消息

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。
为何需要长链接?长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。

12.http常见状态码有哪些?301和302的区别是什么?304是指什么?

答: 404:找不到资源;
500:服务器内部错误;
200:请求成功,并返回数据;
301:永久重定向;
302: 临时移动,可使用原有URI;
304:资源未修改,可使用缓存;
400:请求语法错误(一般为参数错误);
403:没有权限访问。。。等

13.浏览器页面渲染的流程是什么(输入url后页面发生什么)?

答: 首先dns解析IP,建立tcp链接下载资源,构建dom树,当遇到link标签,会下载并执行解析css(不会阻止dom树的构建)当遇到script标签的是,dom树构建会暂停,下载并执行完js才会继续(defer(下载延迟执行),async(异步下载并执行)) 然后再布局和绘制(layout,paint)最后在 render

14.什么是reflow与repain?哪些操作会触发reflow,如何避免

答:reflow:回流,当元素的尺寸、DOM结构发生改变时,浏览器会重新渲染页面,称为回流。
repain:重绘,当元素的样式(布局不发生,color,opacity,visibility)发生改变的时候。

   以下常见操作都会触发:

浏览器窗口大小改变
元素尺寸、位置、内容发生改变
元素字体大小变化
添加或者删除可见的 dom 元素
激活 CSS 伪类(例如::hover)等

通过class的方式集中改样式,documentFragment缓存节点,避免使用table、calc,做动画的节点脱离文档流(新创建图层)。总结:减少DOM操作!

15.HTML5常用的特性(API)有哪些?你用过哪些?

答:语义化标签(header,nav等),video、audio,获取dom的方式(queryselector),websocket
Canvas,svg,requestAnimationFrame,Geolocation,stroage ,notification,file API,Orientation API用于检测手机的摆放方向等

16.请列举出几个常见的浏览器兼容性问题?

答:现在市面上IE678基本已经停止使用了,所以尽量不要说这方面的兼容性。
有些浏览器支持的,有些呢 不支持;或者是支持的方式不一致。
1、不同浏览器的默认margin和padding不一致
2、图片的默认间距不一致
3、获取视口的宽高window.innerheight/width
4、CSS3的动画,过渡,渐变,flex也有,grid
5、Canvas,SVG
6、IE9以下不能的opacity,使用filter: alpha(opacity = 50);
7、event.offsetX/Y
8、绑定事件IE9才支持(addEventListener)

17.什么是浏览器缓存(知道什么是 强缓存 和 协商缓存)?

答:当浏览器访问过后的资源,会被浏览器缓存的本地,当下次在访问页面的时候,如果没有过期,直接读取缓存,加快浏览器的加载效率。

http缓存机制:1、Expires:通过设置最大缓存时间,当时间超过了就去服务器下载,
2、http1.1,cache-control:max-age = time ,当time过期后,检测etag 带上etag往服务器发请求,如果etag没变,直接告诉浏览器读本地缓存,如果没有etag 就会 检测 Last-Modified,判断 如果 上一次更改的时候,距离本次访问时间比较久,说明文件没有发生改变,返回304。

强缓存就是当前访问时间还在设置的最大时间范围内。
协商缓存就是时间过了,通过检查etag或者last-modifed来使用缓存的机制。

18.说一下浏览器垃圾回收机制

答: 老:标记清除算法,GC会检测当前对象有没有被变量所引用,如果没有就回收。
新: Scavenge ,把内存空间分为两部分,分别为 From 空间和 To 空间。当一个空间满了以后,会把空间中活动对象转移到另外一个空间,这样互换。

19.什么是事件委托

 答:事件委托本质上是利用了浏览器事件冒泡的机制。因为事件在冒泡过程中会上传到父节点,并且父节点可以通过事件对象获取到目标节点,因此可以把子节点的监听函数定义在父节点上,由父节点的监听函数统一处理多个子元素的事件,这种方式称为事件代理。使用事件代理我们可以不必要为每一个子元素都绑定一个监听事件,这样减少了内存上的消耗,也是常见的JS性能优化的一个点。

20.什么是响应式布局?如何实现

答:书写一套CSS样式适配PC和移动端,让PC和移动端都能正常的浏览器页面。
使用mate 控制viewport,再配合media query 的 screen 来设置断点样式。
注意:做相应式 不能使用固定单位,要使用max-width、min-width等能自动缩放的单位。

2、JS方面(ES6/ES7)

1.在JS中什么是面向对象程序设计,面向对象设计优点?

答:在JS中面向对象更多说的是通过构造函数或者class封装一个独立的功能,以达到代码的复用。
面向对象的三个特点:
封装:通过对象把属性和方法封装起来,相似对象的话采用构造函数或者类new得到。
继承:通过混合继承(构造函数和原型)的方式,可以达到属性和方法的复用。
多态:通过对象属性覆盖,可以让继承的对象拥有更多行为。

面向对象的程序设计是组织代码的方式,能提升开发效率和代码的可维护性。

2.什么是原型、原型链,有什么作用?

答: 原型:每一个对象都与另一个对象相关联,那个关联的对象就称为原型。

意义:函数Person有一个属性prototype,指向一个对象,对于普通函数来说没多意义,对于构造函数就有作用了,当使用new操作符时,会把Person.prototype(原型对象)赋值给实例的__proto__(原型实例)属性,再通过原型查找机制所有的Person产生的实例都可以访问到挂载到原型上的方法,这样就达到了函数的复用,减少内存开销。

原型查找机制,通过实例调用一个属性的时候,先在实例自身对象上查找,如果实例本身上没有,就去自动去实例的__proto__上去查找。

原型链:每一个对象,都有一个原型对象与之关联,这个原型对象它也是一个普通对象,这个普通对象也有自己的原型对象,这样层层递进,就形成了一个链条,这个链条就是原型链。通过原型链可以实现JS的继承,把父类的原型对象赋值给子类的原型,通过原型查找机制,这样子类实例就可以访问到父类原型上的方法了。

1

2Person.prototype.constructor == Person
3
4Person.prototype.__proto__.constructor  == Object 
5
6Person.prototype.__proto__ == Object.prototype
7         
8Object.prototype.__proto__ == null
9

3.如何实现继承(ES5/ES6)?

答:
10

    function Anima(name){
    //父类
11                  this.name = name;
12              }
13
14              Anima.prototype.sayName = function(){
   
15                    console.log(this.name)
16              }
17
18              function Person(name,age){
    //子类
19                  Anima.call(this,name);
20                  this.age = age;
21              }
22
23              Person.prototype = Object.create(Anima.prototype, {
   
24                constructor: {
   
25                  value: Person,
26                  enumerable: false
27                }
28              })
29
30
31            var p = new Persion("haha",12);

32
33 Extends //ES6

4.什么是作用域以及作用域链?

答:作用域是指程序源代码中定义变量的区域,限定一个变量可访问范围的,作用域的本质是对象。JS采用的词法作用域,在书写代码的时候(定义函数的时候),作用域就已经确定好了。
在ES6环境下,包含3个作用域,全局globel,函数作用域,快级作用域( {} ) (eval)
作用域链:当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。 用途是保证对执行环境有权访问的所有变量和函数的有序访问。本质为执行上下文的scope属性,存储所有的变量,包括局部与全局,控制变量的使用顺序。
参考文献:https://github.com/mqyqingfeng/Blog/issues/6

var b = 10; //1:输出?2:改造代码输出10或20
(function b(){
   
    b = 20;
    console.log(b); 
})();

var b = 10;
(function b(b) {
    在这个函数b是一个常量,在函数b内部是可以使用的,但是不能修改,如果加上use strict 严格模式就会报错。
 window.b = 20;
 console.log(b) //输出10
})(b)
var a = 10;
(function () {
   
    console.log(a)
    a = 5
    console.log(window.a)
    var a = 20;
    console.log(a)
})()

5.什么是闭包,闭包的好处和坏处分别是?

答:当函数可以记住并访问外部作用域时,就产生了闭包,那个外部作用域就称为闭包。

形成的原因:外层函数的作用域对象无法释放。
作用:为了封装对象的私有属性和私有方法,避免全局变量的污染(保护一个变量,重用一个变量)。坏处:使用不当,会造成内存泄漏。

大白话来解释:函数A和函数B,当内部函数B引用了A 的局部变量时,函数A 称为闭包
原因是:JS是词法作用域,B的作用域链上有对A执行环境的引用(这个执行环境用函数来表示),A的执行环境AO就不会回收。

 for (var i = 0
  • 11
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值