基础知识
输入值
function test(m) {m = { v: 5 }}var m = { k: 30}test(m);alert(m.v); // undefined
去重
new Set去重- 新建一个新数组过滤重复元素来去重 for 循环 和 reduce
- 缓存去重
排序
找出数组中的最大值
Math.max.apply(null,arr)- 排序后取第一个值
判断 A 是否在B的原型链上
function isInstanceOf(AA,BB){var AA = AA.__proto__;var BB = BB.prototypevar flag = truewhile (flag){if(AA === null){return false}if(AA === BB) return trueAA = AA.__proto__}}
JS求页面中出现最多次数的标签,并求出出现次数。
function getMaxElement(){const allElements = [...document.getElementsByTagName("*")].map(i => i.tagName.toLowerCase()).reduce((pre,cur) => {if(!pre[cur]){pre[cur] = 0}pre[cur] +=1return pre},{})let result = {},max = 0for(let item in allElements){if(allElements[item] > max){max = allElements[item]result = {[item]:allElements[item]}}}return result}
什么是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
React
React性能优化阶段函数是哪一个?
shouldComponentUpdate:在重新渲染机制回路(虚拟 DOM 对比和 DOM 更新)之前会被触发,赋予开发者跳过这个过程的能力,这个函数默认返回 true,让 React 执行更新。
React性能优化的方案
- 重写
shouldComponentUpdate来避免不必要的dom操作。 - 使用 production 版本的react.js。
- 使用key来帮助React识别列表中所有子组件的最小变化。
合理拆分组件,避免组件不合理的数据变更- 使用React.memo 来避免组件的重复渲染
diff 算法
什么是jsx?为什么浏览器无法读取jsx?
jsx 是 Javascript 的扩展语法。是一种特别的 html 模版。
