前端面试3

1、浏览器渲染过程

http://blog.csdn.net/xiaozhuxmen/article/details/52014901

解析html以构建dom树 -> 构建render树 -> 布局render树 -> 绘制render树

解析过程:
(1) HTML/SVG/XHTML,解析这三种文件会产生一个 DOM Tree。
(2) CSS,解析 CSS 会产生 CSS 规则树。
(3) Javascript脚本,主要是通过 DOM API 和 CSSOM API 来操作 DOM Tree 和 CSS Rule Tree

HTML页面加载和解析流程

  1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件;
  2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件;
  3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件;
  4. 浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了;
  5. 浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
  6. 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;
  7. 浏览器发现了一个包含一行Javascript代码的<script>标签,赶快运行它;
  8. Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=”none”)。突然少了这么一个元素,浏览器不得不重新渲染这部分代码;
  9. 终于等到了</html>的到来,浏览器泪流满面……
  10. 等等,还没完,用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径;
  11. 浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。

2、无刷新路由的实现

使用数组存储路由对象,对象中存放url地址和组件名

跳转时通过window.history.pushState(state, title, url)或者window.history.replaceState(state, title, url)修改

如果不支持html5,则使用hash

3、三次握手改为两次握手或四次握手

两次握手:A->B , B->A, A->B, 第三次对第二次的确认了,才算连接成功。如果改为两次,第二个包能否发送到A,B是不知道的。对第二个包, A如果能成功收到,A则知道建立连接成功了,如果超时,A可判断第二个包发送失败,连接失败。对第二个包,B是不知道能否发送成功的(需要地三个包来确认)

四次握手:三次握手就可以确认客户端和服务器都确立收到包了,可以确立连接了

前端面试3_第1张图片
2MSL

4、原生JS实现lodash.flatten

function flatten (arr, isDeep) {
    var ret = [];
  for (var i = 0; i < arr.length; i++) {
    if (arr[i] instanceof Array) {
      ret = isDeep 
        ? ret.concat(flatten(arr[i], true))
        : ret.concat(arr[i]);
    } else {
      ret.push(arr[i]);
    }
  }
  
  return ret;
}

5、什么时候用到document.write()

  • 加载需要配合JS脚本使用的外部CSS文件

    
        document.write('');
    
    

    将所有需要用到JS的样式都放到这个外部样式表中,如果浏览器不禁用JS,那么该样式表就会被顺利加载,否则页面就不会使用该样式。

  • 在新的窗口中写入新的页面数据时

    document.open();
    document.write('anthing')
    document.close();
    

弊端:

  • 在非loading阶段调用document.write会清除已加载的页面;
  • document.write不能够在XHTML中使用;
  • 嵌入script中的document.write不能给任意节点添加子节点,因为它是随着DOM的构建执行的;
  • 利用document.write写入HTML字符串流并不是一个好方法,它有违DOM操作的概念;
  • 利用document.write添加script加载外部脚本时,浏览器的HTML解析会被script的加载所阻塞;

6、js 位运算

http://www.cnblogs.com/xljzlw/p/4231354.html

7、font-face

CSS3 自定义字体

@font-face{
    font-family: myFont;
    src: url('myFont.ttf'),
             url('myFont.eot')  // 字体资源路径
}

8、json 和 xml比较

http://www.cnblogs.com/SanMaoSpace/p/3139186.html

  • XML的优点

    • 格式统一,符合标准;
    • 容易与其他系统进行远程交互,数据共享比较方便。
  • XML的缺点

    • XML文件庞大,文件格式复杂,传输占带宽;
    • 服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;
    • 客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;
    • 服务器端和客户端解析XML花费较多的资源和时间。
  • JSON的优点:

    • 数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
    • 易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;
    • 支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;
    • 在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;
    • 因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
  • JSON的缺点
     没有XML那么通用性;

9、Web缓存

Web缓存分为数据库缓存、代理服务器缓存、CDN缓存和浏览器缓存

浏览器缓存设置HTTP缓存、WebStorage

10、HTTP协议

Http是一个基于请求与响应模式的无状态的、应用层的协议,常基于TCP的连接方式

HTTP请求由请求行、消息报头、请求正文组成
HTTP响应由响应行、消息报头、响应正文组成

http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

11、最小生成树

无向图n个顶点,构造成一棵树,有n-1条边,没有构成环,加权值最小

https://www.2cto.com/kf/201603/496259.html

12、SSL协议

上层协议:SSL握手协议、SSL密码变化协议、SSL警告协议
底层协议:SSL记录协议

  • SSL握手协议:是SSL协议非常重要的组成部分,用来协商通信过程中使用的加密套件(加密算法、密钥交换算法和MAC算法等)、在服务器和客户端之间安全地交换密钥、实现服务器和客户端的身份验证。
  • SSL密码变化协议:客户端和服务器端通过密码变化协议通知对端,随后的报文都将使用新协商的加密套件和密钥进行保护和传输。
  • SSL警告协议:用来向通信对端报告告警信息,消息中包含告警的严重级别和描述。
  • SSL记录协议:主要负责对上层的数据(SSL握手协议、SSL密码变化协议、SSL警告协议和应用层协议报文)进行分块、计算并添加MAC值、加密,并把处理后的记录块传输给对端。

http://www.jianshu.com/p/d366e5fcd58b

13、前后端分离做SEO

  • 首屏预渲染
  • 服务端渲染SSR,实现前后端同构,一套代码在浏览器和node环境都可以运行
  • Google搜索引擎支持hashtag再rewrite访问静态页面,使用pushState实现无刷新路由控制

https://www.zhihu.com/question/52235652

14、上千条数据显示在DOM列表中,如何防止卡顿

只创建一定数量的DOM节点,滚动时根据滚动条修改DOM节点的内容,比如Framework7的Virtual List组件,通过相对定位设置每个li标签的top,滚动时根据一定的条件,同时修改top和li标签的内容

15、data-xxx 属性

data-属性用来存储页面或应用程序的私有自定义数据

16、margin

在margin属性中一共有两类参考线,top和left的参考线属于一类,right和bottom的参考线属于另一类。top和left是以外元素为参考,right和bottom是以元素本身为参考

17、BFC

Block Formatting Context,中文直译为块级格式上下文。BFC就是一种布局方式,在这种布局方式下,盒子们自所在的containing block顶部一个接一个垂直排列,水平方向上撑满整个宽度(除非内部盒子自己建立了新的BFC)。两个相邻的BFC之间的距离由margin决定。在同一个BFC内部,两个垂直方向相邻的块级元素的margin会发生“塌陷”

创建BFC:

  • float属性不为none
  • overflow不为visible(可以是hidden、scroll、auto)
  • position为absolute或fixed
  • display为inline-block、table-cell、table-caption

BFC作用:

  • 清除浮动
  • 垂直margin合并
  • 创建自适应两栏布局

18、绝对定位和相对定位

绝对定位:absolute,相对于第一个具有定位元素(absolute,relative)的祖先元素,吗,没有定位元素的祖先元素则相对于body定位
相对定位:relative,相对于其在普通流中的位置进行定位的

19、margin叠加

  • 浮动元素和其他任何元素之间不发生外边距叠加 (包括和它的子元素).
  • 创建了 BFC 的元素不会和它的子元素发生外边距叠加
  • 绝对定位元素和其他任何元素之间不发生外边距叠加(包括和它的子元素).
  • inline-block 元素和其他任何元素之间不发生外边距叠加 (包括和它的子元素).
  • 普通流中的块级元素的 margin-bottom 永远和它相邻的下一个块级元素的 margin-top 叠加(除非相邻的兄弟元素clear)
  • 普通流中的块级元素(没有 border-top、没有 padding-top )的 margin-top 和它的第一个普通流中的子元素(没有 clear )发生 margin-top 叠加
  • 普通流中的块级元素( height 为 auto、min-height 为 0、没有 border-bottom、没有 padding-bottom )和它的最后一个普通流中的子元素(没有自身发生 margin 叠加或 clear )发生 margin-bottom 叠加
  • 如果一个元素的 min-height 为 0、没有 border、没有 padding、高度为 0 或者 auto、不包含子元素,那么它自身的外边距会发生叠加

20、元素

块级元素:P|H1|H2|H3|H4|H5|H6|UL|OL|PRE| DL | DIV | NOSCRIPT | BLOCKQUOTE | FORM | HR | TABLE | FIELDSET | ADDRESS

行内元素:#PCDATA(即文本)| TT | I | B | BIG | SMALL|EM | STRONG | DFN | CODE |SAMP | KBD | VAR | CITE | ABBR | ACRONYM|A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO|INPUT | SELECT | TEXTAREA | LABEL | BUTTON

可置换元素:img|input|select|textarea|button|label

21、响应式布局和流式布局

响应式布局:根据不同设备宽度设定不同样式,主要靠媒体查询实现

流式布局:即百分比布局,宽度用百分比,高度用px做单位

你可能感兴趣的:(前端面试3)