JS基础

1. varlet/const的区别

  • var声明的变量会挂到window上,而letconst不会
  • 同一作用域下var可以重复声明同名变量,而letconst不能
  • letconst声明形成块作用域,不能跨块访问,也不能跨函数访问
  • JS 变量存在「创建create、初始化initialize 和赋值assign」,var 的「创建」和「初始化」都被提升,let 的「创建」过程被提升了,但是初始化没有提升;const 只有「创建」和「初始化」,没有「赋值」过程;function 的「创建」「初始化」和「赋值」都被提升(点击查看面试汇总 - 图1
  • letconst 声明的变量拥有暂时性死区(TDZ):范围为从进入它的作用域,这时它不能被访问(获取或设置),直到到达声明语句。死区(dead zone)是真正短暂的(基于时间)和不受空间条件限制(基于位置)

2. 说说JS的作用域和作用域链

作用域指的是变量的可访问性和可见性。有两种作用域:全局作用域和局部作用域;局部作用域只有在固定的代码片段内可访问到。
说到作用域链,首先要先说说执行上下文,当 JavaScript 执行一段可执行代码(executable code)时,会创建对应的执行上下文(execution context)。每个执行上下文,有三个重要属性:
- 变量对象(Variable object,VO)
- 作用域链(Scope chain)
- this
当查找变量的时候,会先从当前上下文的变量对象中查找,如果没有找到,就会从父级(词法层面上的父级)执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。这样由多个执行上下文的变量对象构成的链表就叫做作用域链。

3. 闭包是什么,以及使用闭包有什么问题,怎么排查

能够访问其他函数内部变量的函数,被称为 闭包。使用闭包,可能导致内存泄露(可以就垃圾回收机制也展开讲讲)。排查手段:借助谷歌的开发者工具,打开Performance面板,点击录制,然后查看JS堆内存信息的变化情况。如果呈上升状态,即有可能是内存泄露。

  1. 讲讲原型和原型链
  2. 如何用prototype实现继承
  3. es6的语法用过哪些
  4. typescript 的 type和interface区别

手写

  1. call,apply,bind
  2. 防抖和节流
  3. promise(讲流程)
  4. 实现深拷贝
  5. new关键字(讲流程)
  6. EventEmitter 发布订阅
  7. promise实现串行请求
  8. promise实现并行请求,并可以处理每一个请求的异常(请求异常不影响其他并行的请求)
  9. 数组去重
  10. 获取JS通用类型

网络

  1. 常见http状态码,并说出他们的含义
  2. get和post区别
  3. 三次握手和四次挥手过程
  4. 为什么建立连接是三次握手,关闭连接是四次挥手呢?
  5. HTTP和HTTPS有何区别
  6. HTTPS加密过程

浏览器

  1. 从输入URL到看到页面发生了什么
  2. 浏览器渲染过程
  3. 什么是回流,什么情况下会触发回流,如何减少回流

webpack

  1. 讲讲打包的流程
  2. webpack优化做过什么

React

  1. setState到底是同步还是异步
  2. fiber用来解决什么问题
  3. fiber可中断是怎么实现的
  4. 讲一下react的渲染流程
  5. react项目做过什么性能优化
  6. redux,mobx
  7. hooks和class区别

    Vue

  8. 和react有什么区别

  9. vuex
  10. vue3做了什么优化