帮助中心 > 新闻资讯 >撩课-Web大前端每天5道面试题-Day41

撩课-Web大前端每天5道面试题-Day41

发布时间:2019-01-15

1.DNS解析过程?若是新申请的域名如何查找DNS?

DNS是应用层协议,
事实上他是为其他应用层协议工作的,
包括不限于HTTP和SMTP以及FTP,
用于将用户提供的主机名解析为ip地址。

具体过程如下:
(1)浏览器缓存: 
当用户通过浏览器访问某域名时,
浏览器首先会在自己的缓存中查找是否
有该域名对应的IP地址(若曾经访问过
该域名且没有清空缓存便存在);

(2)系统缓存:
 当浏览器缓存中无域名对应IP则会自动检查
用户计算机系统Hosts文件DNS缓存是否有该域名对应IP;

(3)路由器缓存: 
当浏览器及系统缓存中均无域名对应IP则进入路由器缓存中检查,
以上三步均为客户端的DNS缓存;

(4)ISP(互联网服务提供商)DNS缓存: 
当在用户客服端查找不到域名对应IP地址,
则将进入ISP DNS缓存中进行查询。
比如你用的是电信的网络,
则会进入电信的DNS缓存服务器中进行查找;(或者向网络设置中
指定的local DNS进行查询,
如果在PC指定了DNS的话,如果没有设置
比如DNS动态获取,则向ISP DNS发起查询请求)

(5)根域名服务器: 
当以上均未完成,
则进入根服务器进行查询。
全球仅有13台根域名服务器,
1个主根域名服务器,
其余12为辅根域名服务器。
根域名收到请求后会查看区域文件记录,
若无则将其管辖范围内顶级域名(如.com)服务器IP告诉本地DNS服务器;

(6)顶级域名服务器: 
顶级域名服务器收到请求后查看区域文件记录,
若无则将其管辖范围内主域名服务器的IP地址告诉本地DNS服务器;

(7)主域名服务器: 
主域名服务器接受到请求后查询自己的缓存,
如果没有则进入下一级域名服务器进行查找,
并重复该步骤直至找到正确记录;

(8)保存结果至缓存: 
本地域名服务器把返回的结果保存到缓存,
以备下一次使用,
同时将该结果反馈给客户端,
客户端通过这个IP地址与web服务器建立链接。

2.Ajax请求状态及意义?

在javascript里面写AJax的时,
最关键的一步是对XMLHttpRequest对象建立监听,
即使用“onreadystatechange”方法。
监听的时候,要对XMLHttpRequest对象的请求状态进行判断,
通常是判断readyState的值为4且http返回状态
status的值为200或者304时执行我们需要的操作。
readyState 属性表示Ajax请求的当前状态。

0 代表未初始化。 还没有调用 open 方法
1 代表正在加载。 open 方法已被调用,但 send 方法还没有被调用
2 代表已加载完毕。send 已被调用。请求已经开始
3 代表交互中。服务器正在发送响应
4 代表完成。响应发送完毕

3.使用JS实现获取文件扩展名?

  function getFileExtension(filename) {
    return filename.slice((filename.lastIndexOf(".") - 1 >>> 0) + 2);
  }

  String.lastIndexOf() 
  方法返回指定值(本例中的'.')
  在调用该方法的字符串中最后出现的位置,
  如果没找到则返回 -1。

  对于'filename'和'.hiddenfile',
  lastIndexOf的返回值分别为0和-1无符号右移操作符(»>) 
  将-1转换为4294967295,将-2转换为4294967294,
  这个方法可以保证边缘情况时文件名不变。
  String.prototype.slice() 从上面计算的索引处提取文件的扩展名。
  如果索引比文件名的长度大,结果为""。

4.CommonJS 中的 require/exports 和 ES6 中的 import/export 区别?

CommonJS 模块的重要特性是加载时执行,
即脚本代码在 require 的时候,就会全部执行。
一旦出现某个模块被”循环加载”,
就只输出已经执行的部分,
还未执行的部分不会输出。

ES6 模块是动态引用,
如果使用 import 从一个模块加载变量,
那些变量不会被缓存,
而是成为一个指向被加载模块的引用,
需要开发者自己保证,
真正取值的时候能够取到值。

import/export 最终都是编译为 require/exports 来执行的。

CommonJS 规范规定,每个模块内部,
module 变量代表当前模块。
这个变量是一个对象,它的 exports 属性(即 module.exports )是对外的接口。
加载某个模块,
其实是加载该模块的 module.exports 属性。

export 命令规定的是对外的接口,
必须与模块内部的变量建立一一对应关系。

5.项目做过哪些性能优化?


减少 HTTP 请求数
减少 DNS 查询
使用 CDN
避免重定向
图片懒加载
减少 DOM 元素数量
减少 DOM 操作
使用外部 JavaScript 和 CSS
压缩 JavaScript 、 CSS 、字体、图片等
优化 CSS Sprite
使用 iconfont
字体裁剪
多域名分发划分内容到不同域名
尽量减少 iframe 使用
避免图片 src 为空
把样式表放在 中
把脚本放在页面底部

相关推荐