关于 JS,我们聊什么?

Coding

{Features}

促使 ESM 出现的理念是什么?

  • 模块化编程并不少见,也不新鲜。必须要以它应对复杂的软件构建
  • JS 在快速、大规模崛起,ESM 的复用、指针、tree-shaking,帮助支撑这些复杂的逻辑

有什么容易忽略的性能优化手段?

  • 网络的 CDN、缓存、Gzip
  • 防止内存溢出、图片、列表懒加载也算是优化的一种。

{MVC}

React 最大的性能问题是什么?怎么解决?

  • setState() 语法。一是强制更新,调用了必然整个组件 render();二是全量,状态更新是向下流动的(从 state 到 props 子组件)一整棵树
    • 用 PureComponent 可以解决,理念同纯函数,无副作用,也就是不触发子组件的更新。不过执行的是浅比较,也就是替换整个对象/数组才能更新复杂数据。
  • 逻辑控制组件隐藏,显示和隐藏都是瞬间变化的。
    • 引入动画库

Vue 是否解决了 React 的问题?

  • 性能上,Vue 使用的是响应式机制。一不会强制更新,只会更新数据被触发了更新的部分;二不会触发整个子组件树的更新。
  • 样式上,主要用 style hide 控制隐藏,减少了重排,且天然支持动画
  • React 采用单向数据流,Vue 用指令封装了双向绑定(bind、sync),节约了代码

Hooks 合理吗?它解决了什么问题?

  • React 的核心理念一直都是简单易上手,会 JS 等于会 React。比如用 useMemo 来引入函数式中记忆化的概念,来替换独有的 API PureComponent。
  • 👍 从 OOP 向 FP 迈进,作者认为,交互事件更应该偏向功能,而不是 class。
    • 虽然 OOP 支撑了 MVC 很长一段时间,但是回头看业务开发,很多时候,state 的数据之间,或者交互事件之间,并无实际联系,不如拆分。
    • 让开发者根据业务逻辑的天然的内聚性,来组织代码
  • 👎 这是范式上的尝试,比较冒进。引入了更多 API,增加了学习成本。不过 API 的增加,可以减少了乱设计的情况,比如 useRef() 提醒大家别什么都扔进 state,或者动不动就把非公共方法挂在 class 上。


Detail

{JS}

JS 的诞生是个错误吗?

  • 有可能是 JS 绑架了业界的发展。但是面对缺陷,最好是优化,而不是颠覆。
  • JS 能应对高速发展的时代吗?在刀耕火种的 jQuery 年代,业务简单,JS 的坏处很显眼。但是现在业务编程进入了自动化阶段,业务需求也从普通的切图,上升到复杂的交互,JS 依然能应对,说明它适应着时代。
  • 未来(包括 ES6)的新 API 都是对过去缺陷/问题的补充,甚至有设计(TypeScript)来进行控制。

WebAssembly 的出现是否会取代 JavaScript?

  • V8 几乎是这个星球上最先进的工业级脚本语言引擎。别管你代码怎么梭,只要你能让 V8 走在 Happy Path 上,那妥妥都是原生级性能。
    • 大多数页面不会到死抠性能的地步,JS 也不会在 60FPS 下运行。最高性能的原生,代价极高,损耗了性能的 Vue,开发极爽。
    • 音视频、游戏、大数据是性能的重灾区。
  • ES 规范在不断演化。这门语言向下兼容性极佳并且仍然在进化。技术圈内独家的转译玩法,让隔壁还有人为 2 还是 3 站队的时候,前端们都在用 Chrome 明年才会支持的语法特性了。
  • NPM 背后还有个巨大的娱乐圈,哦不,社区支持。
  • 🐞WebAssembly 工具链复杂、调试困难、调 OpenGL 要回到 WebGL

闭包的生命周期有多长?会引起内存泄漏吗?

  • ⚠️ 它存在于整个程序生命中
  • 用得着就不算泄漏。Vue 源码中也没有对 cache 进行回收

错误类型有包装对象吗?

  • 实际上没有。Object.prorotype.toString() 的结果,只是看起来有那么个字符串。(总得有个精准的判断吧)
  • Reflect.toString.call 更简短,效果一致:’[object Undefined]‘、’[object Null]‘、’[object Boolean]’

函数参数 arguments 转换后是 ‘[object Object]’ 吗?

  • arguments:’[object Arguments]‘,[…arguments] 转成数组就是 ‘[object Array]’
  • …rest:’[object Array]’

{TS}

Tyepscript 是银弹吗?

  • 不是。只是增加可读性、增加严谨性的工具。
  • 真正解决问题,还得看规范和 review。质量问题的重灾区,主要在设计上,极少在类型上

class 与 interface 的异同在哪?

  • 相同:可以相互转化。interface 编译后也是对象,class 可以当成 interface 使用。
  • 不同:interface 是用于规定对象形状的,具体实现由 class 实现。在设计公共类的时候,最适合的是 class 而不是 interface。比如 Cat 继承给 Tiger 和 Leopard,而不是 interface Cat

interface 与 type 的区别在哪?

  • 相同:定义对象形状,支持合并
  • 不同
    • interface:针对对象和继承,比如 readonly、protect、 extends
    • type:支持组合,应对更复杂的情况 type ReactNode = ReactChild ReactFragment ReactPortal boolean null undefined;

给组件用 .d.ts 文件来声明类型行不行?

  • 不行。虽然语法上能编译通过,但是其定义仍然是“库和全局”
  • 正确是声明一个 types.ts