前端常见面试题

TODO:

  1. 原型链
  2. 宏任务、微任务

 

 

 

 

1、关于解构赋值

ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当等号右边的数组成员严格等于undefined,默认值才会生效。

let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'

 

2、W3C标准

W3C(万维网联盟),万维网联盟标准不是某一个标准,而是一些列标准的集合。

网页主要有三部分组成:结构(Structure)、表现(Presentation)、行为(Behavior)。对应的标准也有三方面:结构化标准主要包括XHTML和XML,表现标准语言主要包括CSS、行为标准主要包括(如W3C DOM)、ECMAScript等。这些标准大部分是W3C起草发布,也有一是其他标准组织制定的标准,比如ECMAScript 的ECMAScript的标准。

制定标准是让浏览器遵守标准,让程序员按照标准来编写程序,由此让程序能够支持所有浏览器,能够满足尽可能多的用户。

 

2.1、<!DOCTYPE> 声明

<!DOCTYPE> 声明不是 HTML 标签,它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令。<!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前。

在 HTML 4.01 中,<!DOCTYPE> 声明引用 DTD,因为 HTML 4.01 基于 SGML。DTD 规定了标记语言的规则,这样浏览器才能正确地呈现内容。HTML5 不基于 SGML,所以不需要引用 DTD。:请始终向 HTML 文档添加 <!DOCTYPE> 声明,这样浏览器才能获知文档类型。

在 HTML 4.01 中有三种 <!DOCTYPE> 声明。在 HTML5 中只有一种:

<!DOCTYPE html>

其它版本的HTML的 DOCTYPE 声明请参考:http://www.w3school.com.cn/tags/tag_doctype.asp

 

2.2、<meta> 标签

<meta> 元素提供了有关页面的信息,比如针对搜索引擎和更新频度的描述和关键词。<meta> 标签位于文档的头部,在HTML中没有结束标签,标签不包含任何内容,而是在标签的属性定义与文档相关联的名称/值对。

在 HTML 4.01 中定义字符集:

<meta http-equiv="content-type" content="text/html; charset="UTF-8">

在 HTML 5 中有一个新的 charset 属性,它使字符集的定义更加容易,使用方法:

<meta charset="UTF-8">

详情参考:http://www.w3school.com.cn/tags/tag_meta.asp

其它标准请参考:https://blog.csdn.net/erdfty/article/details/81363893

 

3、DOM

DOM 是 Document Object Model(文档对象模型)的缩写。

W3C DOM 标准被分为 3 个不同的部分:

  • 核心 DOM - 针对任何结构化文档的标准模型
  • XML DOM - 针对 XML 文档的标准模型
  • HTML DOM - 针对 HTML 文档的标准模型

 

3.1、HTML DOM

HTML DOM 是:

  • HTML 的标准对象模型
  • HTML 的标准编程接口
  • W3C 标准

HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。换言之,HTML DOM 是关于如何获取、修改、添加或删除 HTML 元素的标准。

在 HTML DOM 中,所有事物都是节点。

根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:

  • 整个文档是一个文档节点
  • 每个 HTML 元素是元素节点
  • HTML 元素内的文本是文本节点
  • 每个 HTML 属性是属性节点
  • 注释是注释节点

详情参考:http://www.w3school.com.cn/htmldom/dom_nodes.asp

 

4、浏览器如何渲染页面的?

1、HTML被HTML解析器解析成DOM树。

2、CSS被CSS解析器解析成CSS规则树。

3、浏览器会将CSS规则树附着在DOM树上,并结合两者生成渲染树Render Tree。

4、生成布局(flow)。浏览器通过解析计算出每一个渲染树节点的位置和大小,在屏幕上画出渲染树的所有节点。

5、将布局绘制(paint)在屏幕上,显示出整个页面

 

5、说一说new会发生什么?

  1. 创建一个空对象
  2. 将新对象的__proto__指向构造函数的prototype(原型对象)
  3. 让构造函数内的this指向该对象
  4. 判断是否有返回值,如果有则返回该返回值,如果没有则返回this

 

6、浏览器输入URL后发生了什么?

1、解析URL:判断浏览器输入的是搜索内容还是URL;

2、查找缓存:如果能找到缓存则直接返回页面,如果没有缓存则需要发送网络请求页面;

3、DNS域名解析;

4、三次握手建立TCP连接;

5、发起HTTP请求;

6、服务器响应并返回结果;

7、通过四次挥手释放TCP连接;

8、浏览器渲染;

9、js引擎解析

 

7、TCP协议

7.1、三次握手

开始客户端和服务器都处于CLOSED状态,然后服务端开始监听某个端口,进入LISTEN状态

第一次握手(SYN=1, seq=x),发送完毕后,客户端进入 SYN_SEND 状态
第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1), 发送完毕后,服务器端进入 SYN_RCVD 状态。
第三次握手(ACK=1,ACKnum=y+1),发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入 ESTABLISHED 状态,TCP 握手,即可以开始数据传输。

 

7.1.1、为什么连接建立需要三次握手,而不是两次握手?

防止已经失效的连接请求报文段又被服务端接收到,从而产生错误让服务器端浪费资源。

情景假设:A发出连接请求,但因连接请求报文丢失而未收到确认报文,于是A便超时重发请求报文,然后收到了B发来的确认,建立连接,数据传输完毕后,就释放了连接。但如果A发出的第一个请求报文并没有失效而是滞留了,过段时间后到达了B,此时B就会向A发出确认报文。如果没有第三次握手,那么只要发出确认B就以为建立了新的连接,由于A早已处于CLOSED状态,并不会理睬B的确认报文,也不会向B发送数据,而此时 B 在继续等待 A 发来数据,从而导致白白浪费资源。

 

7.2、TCP四次挥手

第一次挥手(FIN=1,seq=u),发送完毕后,客户端进入FIN_WAIT_1 状态
第二次挥手(ACK=1,ack=u+1,seq =v),发送完毕后,服务器端进入CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态
第三次挥手(FIN=1,ACK1,seq=w,ack=u+1),发送完毕后,服务器端进入LAST_ACK 状态,等待来自客户端的最后一个ACK。
第四次挥手(ACK=1,seq=u+1,ack=w+1),客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。

 

7.2.1、为什么要 4 次挥手?

主要是为了确保数据能够完成传输。 在关闭连接时,当收到主动关闭方的 FIN 报文通知时,它仅仅表示它没有数据发送给你了,但不代表你已经把所有的数据都全部发送给对方了,所以你不会马上会关闭传输数据的SOCKET,而是回复一个ACK确认收到对方的关闭请求,而你需要把剩下的数据传输给对方之后,再发送 FIN 报文给对方来表示你同意现在可以关闭连接了,所以这里的 ACK 报文和 FIN 报文多数情况下都是分开发送的。

 

例子:

小明和小红打电话聊天,通话差不多要结束时,小红说“我没啥要说的了”,小明回答“我知道了”。但是小明可能还会有要说的话,小红不能要求小明跟着自己的节奏结束通话,于是小明可能又叽叽歪歪说了一通,最后小明说“我说完了”,小红回答“知道了”,这样通话才算结束。

 

posted @ 2019-02-28 14:53  wenxuehai  阅读(232)  评论(0编辑  收藏  举报
//右下角添加目录