前端面试除了常见八股文还应知道的细节

135 阅读7分钟

持续补充

1.Html

2.CSS

2.1 关于flex

参考这篇博客

  • flex:flex-grow(0不放大) flex-shrink(1空间不够默认缩小) flex-basis(auto默认占据本身大小的空间)
  • flex值是initial表示默认值0 1 auto
  • flex值是普通数字表示flex-grow的值,shirk默认1,basis默认0%
  • flex值是长度或百分比表示flex-basis,grow和shrink都是1
  • flex值是两个两个非负数字:则分别视为 flex-grow 和flex-shrink的值,flex-basis 取 0%
  • flex值是none表示0 0 auto不会伸缩
  • flex值是auto表示1 1 auto自动填满剩余空间
  • 同时设置了width和flex-basis时,取flex-basis的值

剩余空间放大或缩小的计算

父盒子包裹两个子盒子

  • 有剩余空间要放大(只有一个元素设置了flex-grow就由它占据所有剩余空间)

分配到剩余空间宽度=剩余空间宽度*(自身元素的flex-grow值/所有元素的flex-grow值得和)

计算结果是: A总宽度 /B总宽度 = 分配到剩余空间宽度+自身宽度

  • 空间溢出要缩小

分配到减小宽度 = 超出宽度*(自身宽度*(自身元素的flex-shrink值/所有子元素的flex-shrink值*自身宽度的和))

假设父盒子400px,左A盒子200px,flex-shrink:3,右B盒子300px,flex-shrink:2。超出100px。

A减小的宽度 = 100px * (200px * 3/(200 * 3 + 300 * 2))= 50px

B减小的宽度 = 100px * (300px * 2/(200 * 3 + 300 * 2))= 50px

2.1.1 flex1和flex2有什么不同?

首先flex为非负数字的话,表示flex-grow:数字,flex-shirk:1,flex-basis:0%。如果主轴在水平方向,元素a设置了flex:1;width:100px;,元素a设置了flex:2;width:100px;,两者width不起作用(flex取非负数字flex-basis默认0%),元素a和元素b的宽度为flex-grow分配到的剩余空间大小

2.2 文档流和脱离文档流

文档流就是html元素按照从上到下,从左到右的顺序排列 脱离文档流就是元素不再占据正常的位置,其他遵从正常文档流的元素排列时也会忽略它。

2.2.1 什么会导致脱离文档流

浮动:其他盒子会无视这个元素,但其他盒子内的文本依然会为这个元素让出位置,环绕在该元素的周围。 定位:absolute脱离文档流后按照已定位父元素排列 fixed 脱离文档流后按照浏览器窗口排列

3.JavaScript/ES6

3.1 关于数组

3.1.1 for in和for of

  • for in拿到的是key/index,for of拿到的是value
  • for in可以遍历可枚举数据(numerable:true),而for of可以遍历可迭代数据(实现了Iterator接口)
  • for in可遍历原型上的可枚举属性
for infor of
对象Map、Set
数组数组
字符串字符串

for in遍历对象的顺序是先遍历出整数属性(integer properties,按照升序),然后其他属性按照创建时候的顺序遍历出来。

3.1.2 for in、和for遍历数组的区别

  • 当数组中有undefined for in 不会遍历,并且在遍历数组时遍历到数组原型上的length等属性。 for会打印出undefined

3.1.3 forEach

  • 不能使用return,break,continue来终止循环
  • 参数:回调函数和this,回调函数参数(cur,index,arr)后两个可选
  • 在回调函数内部有三个参数,item,index,arr分别代表,当前项,当前项的下标,数组本身.
  • 它会对数组的每一个元素执行一次提供的函数,不改变原数组但是原数组可能被回调函数改变
  • 没有返回值永远都是undifind

3.1.4 reduce

  • 接收两个参数callback函数和第一次调用 callback 函数时参数 previousValue 的值
  • 回调函数参数(prev,cur,curIndex,arr)
  • reduce返回值是最后一次的prev值
  • 如果没有初始previousValue值,默认回调函数中以数组第一个值为prev,第二个值为cur。
  • 如果数组只有一个值且没有初始prev,回调函数不执行,直接返回这个值

3.1.5 sort

不写回调函数,按照什么排序? 把元素转换成字符串,按照字符的unicode编码排序

3.1.6 判断是不是数组的方法

  • Array.is()
  • instanceof
  • constructor :arr.constructor===Array
  • Object.prototype.toString.call()
  • arr.__proto__===Array.prototype

3.2 关于对象

遍历对象的方法

  • for in 可遍历继承的和原型链上的可枚举属性,下面的都不可以,可用hasOwnProperty()过滤继承的或原型链上的属性
  • Object.keys(),Object.values()返回可枚举属性/属性值组成的数组
  • Object.getOwnPropertyNames() 可遍历所有枚举、不可枚举属性(除以symbol类型作为属性名)

3.3 关于隐式类型转换

参考文章

==和运算符转换都要了解

3.1 promise

重点就是:then只有等前面的then返回的promise状态不是pedding了才会放入微任务队列。then里执行完没有手动返回新的promise,那会默认返回一个resolved状态的promise。但是promise里一定要手动调用resolve和reject,状态才会改变,第一个then才会执行。async await后面的语句相当于promise.then

3.1.1 连续调用promise then执行顺序

3.1.2 catch

catch返回的还是一个promise,仍然可以接then

3.2 async/await代码输出

理解 async await

关于async await小争议

3.2.1 async await异常处理

解决then连续调用、嵌套问题 await必须在async函数内使用

async声明function是一个异步函数,返回一个promise对象,可以使用 then 方法添加回调函数。async函数内部return语句返回的值,会成为then方法回调函数的参数。

await 后是promise,那等待promise完成,不是promise就返回值本身。promise是rejected状态,就会阻塞后面代码执行,后面的不会执行。

异常处理 1.try catch 对await进行try Catch包裹 async内部throw出错误,外面也可以catch到 2. 库 awaittojs,使用to函数

3.3 weakMap

Map中key可以是任何类型。而weakMap中的key必须是引用类型,而且对键名是弱引用,对键值是正常引用。

3.4 关于百分比布局

哪个是包含块?由postion确定包含块。

1.padding和margin都是由包含块的width决定

2.width和height是由包含块的width和height决定

3.定位position使用的left,right由包含块width决定,top,bottom由height决定

4.translate由本身width和height决定

3.5 事件循环

除了宏任务和微任务还有其他事件吗? dom渲染,执行完所有微任务开始下一轮事件循环之前会进行dom渲染,

5. 关于Vue

5.1 计算属性能不能修改data中的值---------不能

5.2 nexttick是宏任务还是微任务-----------微任务

5.3 provide/inject 是响应式的吗?如何变成响应式?

不是响应式的,传递基本类型不能实现响应式。可以用函数包裹起来,将函数传递过去。引用类型传递地址变相实现响应式。

4. 关于网络

4.1 代理

参考文章

  • 正向代理是客户端的代理,服务器不知道真正的客户端是谁;反向代理是服务器的代理,客户端不知道真正的服务器是谁
  • 正向代理是客户端向代理服务器发送一个请求,指定目标服务器。
  • 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,对于客户端来说,反向代理就相当于目标服务器,只需要将反向代理当作目标服务器一样发送请求就可以了,并且客户端不需要进行任何设置。

4.2 跨域

跨域、正向、反向代理

webpack和vue-cil设置proxy/proxytable是正向代理,Nginx是反向代理。