tiantingrui / daily-harvest

记录每日收获
MIT License
2 stars 0 forks source link

技术深度 #42

Open tiantingrui opened 2 years ago

tiantingrui commented 2 years ago

考察重点

注意事项

tiantingrui commented 2 years ago

1. JS内存泄露如何检测?场景有哪些?

垃圾回收GC

Garbage collection

什么是垃圾回收?

JS垃圾回收用什么算法

  1. 引用计数(之前,ie6-7)
    1. 缺陷:循环引用
  2. 标记清除(现代)

【追问】JS闭包是内存泄露吗?

闭包是符合我们的预期内存使用,不算内存泄露,仅仅只是内部的数据不可以被垃圾回收!

JS内存泄露如何检测?

利用谷歌浏览器的 performance memory

内存泄露的场景(vue为例)

【扩展】WeakMap WeakSet

弱引用,不会影响垃圾回收

WeakMap 的 key 只能是引用类型,不能是字符串

tiantingrui commented 2 years ago

2. 浏览器和 nodejs事件循环

单线程和异步

宏任务和微任务

const p = document.createElement('p')
p.innerHtml = '111'
document.body.appendChild(p)
const list = document.getElementsByTagName('p')
console.log('length --', list.length)

console.log('start')
setTimeout(() => {
  const list = document.getElementsByTagName('p')
    console.log('length on timeout --', list.length)
  alert('阻塞 timeout')
})
Promise.resolve().then(() => {
  const list = document.getElementsByTagName('p')
    console.log('length on promise then --', list.length)
  alert('阻塞 timeout')
})

console.log('end')

Nodejs 异步

console.log('start')

setImmediate(() => {
  console.log('setImmediate')
})

setTimeout(() => {
  console.log('timeout')
})

Promise.resolve().then(() => {
  console.log('promise then')
})

process.nextTick(() => {
  console.log('nextTick')
})

console.log('end')

// start end  nextTick promise then timeout  setImmediate

nodejs 宏任务类型和优先级

nodejs 微任务类型和优先级

nodejs event loop

  1. 执行同步代码
  2. 执行微任务(process.nextTock 优先级最高)
  3. 按顺序执行6个类型的宏任务(每个结束时都执行当前的微任务)

总结

浏览器和node的eventloop流程基本相同,而nodejs宏任务和微任务分类型,有优先级

注意事项

tiantingrui commented 2 years ago

3. 虚拟DOM真的很快么

vdom

Vue React 等框架的价值

数据驱动视图,技术方案 - vdom

diff算法 vnode oldVnode (vdom)

注意

  1. vdom并不快,JS直接操作DOM才是最快的
  2. 但 “数据驱动视图“ 要有合适的技术方案,不能全部DOM重建
  3. vdom就是目前最合适的技术方案(并不是因为它快,而是合适

扩展:svelte 就没用 vdom