【前端面试题】前端基础 | 八股文 | HTTP网络 | Vue | React

⭐️ 本文首发自 前端修罗场(点击加入),是一个由 资深开发者 独立运行 的专业技术社区,我专注 Web 技术、Web3、区块链、答疑解惑、面试辅导以及职业发展博主创作的 《前端面试复习笔记》(点击订阅),广受好评,已帮助多人提升实力、拿到 offer。现在订阅,私聊我即可获取一次免费的模拟面试机会,帮你评估知识点的掌握程度,获得更全面的学习指导意见!

盒模型

  • https://www.cnblogs.com/chengzp/p/cssbox.html

盒模型的组成大家肯定都懂,由里向外content,padding,border,margin.

盒模型是有两种标准的,一个是标准模型,一个是IE模型。

【前端面试题】前端基础 | 八股文 | HTTP网络 | Vue | React_第1张图片

【前端面试题】前端基础 | 八股文 | HTTP网络 | Vue | React_第2张图片

  • 在标准模型中,盒模型的宽高 = 内容(content)的宽高,

  • IE模型中盒模型的宽高 = 内容(content)+填充(padding)+边框(border)的总宽高

  • css如何设置两种模型:

    /* 标准模型 */
    box-sizing:content-box;
    /*IE模型*/
    box-sizing:border-box;
    
  • js获取宽高

    dom.offsetWidth/offsetHeight //最常用的,也是兼容最好的
    
  • 边距重叠

边距重叠解决方案BFC(块级格式化上下文)

//原理

  1. 内部的box会在垂直方向,一个接一个的放置
  2. 每个元素的margin box的左边,与包含块border box的左边相接触(对于从左往右的格式化,否则相反)
  3. box垂直方向的距离由margin决定,属于同一个bfc的两个相邻box的margin会发生重叠
  4. bfc的区域不会与浮动区域的box重叠
  5. bfc是一个页面上的独立的容器,外面的元素不会影响bfc里的元素,反过来,里面的也不会影响外面的
  6. 计算bfc高度的时候,浮动元素也会参与计算
  • 创建BFC
  1. float属性不为none(脱离文档流)
  2. position为absolute或fixed
  3. display为inline-block,table-cell,table-caption,flex,inine-flex
  4. overflow不为visible
  5. 根元素
  • 应用场景
    1. 自适应两栏布局
    2. 清除内部浮动
    3. 防止垂直margin重叠

清除浮动

  • 父级div定义伪类:after和zoom

    .clearfloat:after{display:block;clear:both;content:"";visibility:hidden;height:0}
    .clearfloat{zoom:1}//zoom(IE转有属性)可解决ie6,ie7浮动问题
    
  • 在结尾处添加空div标签clear:both

    .clearfloat{clear:both}//添加一个空div,利用css提高的clear:both清除浮动,让父级div能自动获取到高度
    
  • 父级div定义height

    父级div手动定义height,就解决了父级div无法自动获取到高度的问题
    
  • 父级div定义overflow:hidden

    必须定义width或zoom:1,同时不能定义height,使用overflow:hidden时,浏览器会自动检查浮动区域的高度
    
  • 父级div定义overflow:auto

    必须定义width或zoom:1,同时不能定义height,使用overflow:auto时,浏览器会自动检查浮动区域的高度
    
  • 父级div也一起浮动

    所有代码一起浮动,就变成了一个整体,会产生新的浮动问题。
    
  • 父级div定义display:table: 将div属性变成表格

  • 结尾处加br标签clear:both:父级div定义zoom:1来解决IE浮动问题,结尾处加br标签clear:both

Position

https://segmentfault.com/a/1190000013683068

inline-block中间会有空隙

内联块元素具有了内联元素以及块级元素的特性:(1)元素之间可以水平排列 (2)可以当做一个块级元素来设置各种的属性,例如:width、height、padding等

间隙是由换行或者回车导致的。只要把标签写成一行或者标签直接没有空格,就不会出现间隙。但是这种方式是不太可靠。在父容器上使用font-size:0;可以消除间隙(把空格隐藏/去除),对于Chrome, 其默认有最小字体大小限制,考虑到兼容性,需要取消字体大小限制。

.demo {font-size: 0;-webkit-text-size-adjust:none;}

层叠优先级

浏览器默认的样式 < 网页制作者样式 < 用户自己设置的样式

按照权重取最大(取权重最大值显示)去确定最后样式:

!importrant >内联>ID派生选择器(#id h1)> id(100)> class(10)>标签(1)>继承(0.5)

怎样覆盖 !important

很简单,只需再添加一条 带 !important 的CSS规则,再给这个给选择器更高的优先级(添加一个标签,ID或类);或是添加一样选择器,把它的位置放在原有声明的后面,总之,最后定义一条规则比胜)。

或者使用相同的选择器,但是置于已有的样式之后;

或干脆改写原来的规则,以避免使用 !important

HTTP:地址栏输入url到显示页面的步骤

基本流程:

a. 域名解析

b. 发起TCP的3次握手(TCP连接理论上不会自动断开)

c. 建立TCP连接发起http请求

d. 服务器端响应http请求,浏览器得到html代码

e. 浏览器解析html代码,并请求html代码中的资源

f. 浏览器对页面进行渲染呈现给用户

  1. 在浏览器地址栏输入URL
  2. 浏览器查看缓存,如果请求资源在缓存中并且新鲜,跳转到转码步骤
    • 如果资源未缓存,发起新请求
    • 如果已缓存,检验是否足够新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证。
    • 检验新鲜通常有两个HTTP头进行控制Expires和Cache-Control:
      • HTTP1.0提供Expires,值为一个绝对时间表示缓存新鲜日期
      • HTTP1.1增加了Cache-Control: max-age=,值为以秒为单位的最大新鲜时间
  3. 浏览器解析URL获取协议,主机,端口,path
  4. 浏览器组装一个HTTP(GET)请求报文
  5. 浏览器获取主机ip地址,过程如下:
    • 浏览器缓存
    • 本机缓存
    • hosts文件
    • 路由器缓存
    • ISP DNS缓存
    • DNS递归查询(可能存在负载均衡导致每次IP不一样)
  6. 端口建立TCP链接,三次握手
  7. TCP链接建立后发送HTTP请求
  8. 服务器接受请求并解析,将请求转发到服务程序,如虚拟主机使用HTTP Host头部判断请求的服务程序
  9. 服务器检查HTTP请求头是否包含缓存验证信息如果验证缓存新鲜,返回304等对应状态码
  10. 处理程序读取完整请求并准备HTTP响应,可能需要查询数据库等操作
  11. 服务器将响应报文通过TCP连接发送回浏览器
  12. 浏览器接收HTTP响应,然后根据情况选择**关闭TCP连接或者保留重用,关闭TCP连接的四次握手
  13. 浏览器检查响应状态吗:是否为1XX,3XX, 4XX, 5XX,这些情况处理与2XX不同
  14. 如果资源可缓存,进行缓存
  15. 对响应进行解码(例如gzip压缩)
  16. 根据资源类型决定如何处理(假设资源为HTML文档)
  17. 解析HTML文档,构件DOM树,下载资源,构造CSSOM树,执行js脚本,这些操作没有严格的先后顺序,以下分别解释
  18. 构建DOM树
  19. 解析过程中遇到图片、样式表、js文件,启动下载
  20. 构建CSSOM树
  21. 根据DOM树和CSSOM树构建渲染树
  22. js解析
  23. 显示页面

数据类型

  • 基本类型:数字(number)、字符串(string)、布尔值(boolean)、null、undefined、Symbol

  • 引用(对象)类型:function、array、object 对象是可变的,即值是可以修改的;对象的比较并非值得比较

  • undefined表示系统级的、出乎意料的或类似错误的值的空缺;表示缺少值,此处应该有值,但没有定义

  • null表示程序级的、正常的或在意料之中的值的空缺; 一般多使用null。

    null表示没有对象,即该处不应该有值

    1) 作为函数的参数,表示该函数的参数不是对象

    2) 作为对象原型链的终点

    undefined表示缺少值,即此处应该有值,但没有定义

    1)定义了形参,没有传实参,显示undefined

    2)对象属性名不存在时,显示undefined

    3)函数没有写返回值,即没有写return,拿到的是undefined

    4)写了return,但没有赋值,拿到的是undefined

    null和undefined转换成number数据类型

    null 默认转成 0

    undefined 默认转成 NaN

    typeof null         // object (因为一些以前的原因而不是'null')
    typeof undefined    // undefined
    null === undefined  // false
    null  == undefined  // true
    null === null  // true
    null == null  // true
    !null //true
    isNaN(1 + null)  // false
    isNaN(1 + undefined)  // true
    
  • Symbol:它的功能类似于一种标识唯一性的ID。通常情况下,我们可以通过调用Symbol()函数来创建一个Symbol实例:

    let s1 = Symbol()
    

    每个Symbol实例都是唯一的。因此,当你比较两个Symbol实例的时候,将总会返回false.

    应用场景:

    1. 使用Symbol来作为对象属性名(key)

      注意:Symbol类型的key是不能通过Object.keys()或者for...in来枚举的,它未被包含在对象自身的属性名集合(property names)之中,所以,利用该特性,我们可以**把一些不需要对外操作和访问的属性使用Symbol来定义。**当使用JSON.stringify()将对象转换成JSON字符串的时候,Symbol属性也会被排除在输出内容之外

    2. 使用Symbol来替代常量

      const TYPE_AUDIO = Symbol()
      const TYPE_VIDEO = Symbol()
      const TYPE_IMAGE = Symbol()
      
    3. 使用Symbol定义类的私有属性/方法:私有化内部属性/方法

    4. 注册和获取全局Symbol

      通常情况下,我们在一个浏览器窗口中(window),使用Symbol()函数来定义和Symbol实例就足够了。但是,如果你的应用涉及到多个window(最典型的就是页面中使用了