基础知识

输入值

  1. function test(m) {
  2. m = { v: 5 }
  3. }
  4. var m = { k: 30}
  5. test(m);
  6. alert(m.v); // undefined

去重

  • new Set 去重
  • 新建一个新数组过滤重复元素来去重 for 循环 和 reduce
  • 缓存去重

排序

找出数组中的最大值

  • Math.max.apply(null,arr)
  • 排序后取第一个值

判断 A 是否在B的原型链上

  1. function isInstanceOf(AA,BB){
  2. var AA = AA.__proto__;
  3. var BB = BB.prototype
  4. var flag = true
  5. while (flag){
  6. if(AA === null){
  7. return false
  8. }
  9. if(AA === BB) return true
  10. AA = AA.__proto__
  11. }
  12. }

JS求页面中出现最多次数的标签,并求出出现次数。

  1. function getMaxElement(){
  2. const allElements = [...document.getElementsByTagName("*")]
  3. .map(i => i.tagName.toLowerCase())
  4. .reduce((pre,cur) => {
  5. if(!pre[cur]){
  6. pre[cur] = 0
  7. }
  8. pre[cur] +=1
  9. return pre
  10. },{})
  11. let result = {},max = 0
  12. for(let item in allElements){
  13. if(allElements[item] > max){
  14. max = allElements[item]
  15. result = {[item]:allElements[item]}
  16. }
  17. }
  18. return result
  19. }

什么是MVVM

MVVM最早由微软提出来,它借鉴了桌面应用程序的MVC思想,在前端页面中,把Model用纯JavaScript对象表示,View负责显示,两者做到了最大限度的分离。
把Model和View关联起来的就是ViewModel。ViewModel负责把Model的数据同步到View显示出来,还负责把View的修改同步回Model。
这就是MVVM的设计思想:关注Model的变化,让MVVM框架去自动更新DOM的状态,从而把开发者从操作DOM的繁琐步骤中解脱出来!

解释一下事件循环?

JS中有各种各样的事件,比如浏览器事件,网络事件,用户事件等等。因为JS运行是单线程的,所以执行这些事件时,会把事件添加到消息队列里。事件处理程序会按照队列先进先出的原则从队首去取出任务执行,执行完毕继续从队列去取,一直循环这个过程。这就是JS的事件循环机制。
扩展问题:为什么要引入事件循环?
因为需要处理 JavaScript 执行过程中有新的任务进来的情况。
宏任务和微任务
winter 博客中说 宿主环境执行的是宏任务,JS 引擎执行的是微任务。没太弄明白。
个人理解 :
宏任务是在主线程上执行的任务,
微任务就是一个异步执行的函数,执行时间在当前任务执行完毕之后,开始下一个宏任务之前。

Node中的事件循环和浏览器的事件循环有什么区别?

JS 如何执行一段代码

V8执行JS代码的时候,会首先将源码解析成抽象语法树(AST),解析的过程主要有两个阶段,分别是词法分析和语法分析。词法分析它的作用是将源码分成一个个不可再分的token,比如关键字,变量,赋值运算符,字符串等等。语法分析是将生成的token 进行分析,是否有语法错误,如果没有语法错误就会生成AST。解析结束就会生成执行上下文。有了AST 和上下文,接下来就会生成字节码 (字节码就是介于 AST 和机器码之间的一种代码。但是与特定类型的机器码无关,字节码需要通过解释器将其转换为机器码后才能执行。)
接下来就要进入执行阶段,这个阶段比较特殊的一点就是,如果一段代码被反复执行的话,引擎会标注这段代码热点代码。后台的编译器会直接将其编译为机器码,提高运行效率。具体到 V8,就是指解释器 Ignition 在解释执行字节码的同时,收集代码信息,当它发现某一部分代码变热了之后,TurboFan 编译器便闪亮登场,把热点的字节码转换为机器码,并把转换后的机器码保存起来,以备下次使用。

Vue


Vue

React


React性能优化阶段函数是哪一个?

shouldComponentUpdate:在重新渲染机制回路(虚拟 DOM 对比和 DOM 更新)之前会被触发,赋予开发者跳过这个过程的能力,这个函数默认返回 true,让 React 执行更新。

React性能优化的方案

  1. 重写shouldComponentUpdate来避免不必要的dom操作。
  2. 使用 production 版本的react.js。
  3. 使用key来帮助React识别列表中所有子组件的最小变化。
  4. 合理拆分组件,避免组件不合理的数据变更
  5. 使用React.memo 来避免组件的重复渲染

diff 算法

官方链接

什么是jsx?为什么浏览器无法读取jsx?

jsx 是 Javascript 的扩展语法。是一种特别的 html 模版。

Hooks 有哪些坑,你是怎么处理的?