diff options
| author | eltrac <hi@eltr.ac> | 2026-04-07 09:52:29 +0800 |
|---|---|---|
| committer | eltrac <hi@eltr.ac> | 2026-04-07 09:52:29 +0800 |
| commit | 5f1b854b70902b53ec8ffe72df9219456f42ce1e (patch) | |
| tree | 819b90c923505fd374f646c37d6f5cef5ff89d5b | |
| parent | 91a016f7a3759c9d47454223a2f7348b3cef4417 (diff) | |
docs: update draft
| -rw-r--r-- | content/article/js-problem.md | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/content/article/js-problem.md b/content/article/js-problem.md index 4b2d16ef..aaf71f76 100644 --- a/content/article/js-problem.md +++ b/content/article/js-problem.md @@ -119,14 +119,49 @@ user=> (= "0" 0) false ``` -至此,我相信可以得出结论说:JavaScript 是一门为了做到方便,而被设计得极其不符合直觉的语言。方便和符合直觉可以共存,但 JavaScript 给出的是错误答案。 +再来做一道选择题吧,以下哪个 JavaScript 表达式的值是 `false`? -## 十天内诞生的编程语言 + > Math.max();` <br/> C. `NaN === NaN;` D. `0 == ''`") + +答案是 C,`NaN` 不是自等的。*是的,一切都是 `object`,最小数比最大数更搭,以及老生常谈的,`0` 等于空字符串。* + +还有一个设计缺陷非常好笑,简直是 JavaScript 所有类型问题的集大成者。 + +```js +{} + {} +// => NaN +({} + {}) +// => '[object Object][object Object]' +{} + [] +// => 0 +``` + +这门语言还有变量作用域等各方面的问题,至此,我相信可以得出结论说:JavaScript 是一门为了做到方便,而被设计得极其不符合直觉的语言。方便和符合直觉可以共存,但 JavaScript 给出的是错误答案。 + +## 十天诞生的编程语言 + +2000 前最流行的浏览器叫作 Netscape Navigator(前身是 Mosaic),1995 年 Netscape 决定要给浏览器添加交互能力,他们原本打算把 Java 或 Scheme 嵌入浏览器中(*真是两条…… 截然相反的道路*),为此雇佣了 Brenden Eich 完成 Scheme 的嵌入工作,后来他们决定造一门新语言,于是让这个新雇佣的程序员在**两周**内完成并发布了 LiveScript。由于当时 Java 很火,所以后来更名为 JavaScript。 + +联想到仓促的开发周期,就不难理解 JavaScript 为什么有这么多的缺陷。再加上 JavaScript 不是社区产物,而是一家企业为自家浏览器产品开发的差异化功能,长时间都没有统一的规范,*就和 Markdown 一样*。 + +比如 JavaScript 没有原生的模块系统,主流的支持模块的 JavaScript 标准有两个:EMCAScript 和 CommonJS。前者使用 `import` 和 `export`,后者使用 `require()` 导入模块。目前,EMCAScript 受到广泛支持,已经成为事实意义上的 JS 标准。 + +给这门仓促开发的编程语言打的补丁还有很多,比如 TypeScript 就硬生生把它变成了一门强类型语言(前面我已经讨论过 JS 的问题并非源自它是弱类型语言这个事实)。 + +打补丁能解决的问题是有限的,为了保证兼容性(更何况是一门所有浏览器甚至服务器后端都在使用的编程语言),很多设计缺陷保留至今,加上各种补丁反而让 JavaScript 看起来像个臃肿丑陋的怪物。比如,JavaScript 自带的时间类型非常难用,最近推出的 [Temporal](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Temporal) 解决了这个问题,解决方法是增加了新的时间类型,同时兼容旧的、有问题的时间类型。很难相信,现代化的用于处理时间和日期的基础数据类型,竟然在 2026 年还没有得到广泛支持。 ## 无处不在的过度抽象 +除了这门语言本身的问题,它的使用者也经常受到嘲笑。 + +首先,如今人们开发一个最简单的网页都会用 React 或者 Vue.js 等现代的前端框架,还要为这些框架导入样式库(比如 TailwindCSS 和 shadcn),哪怕他们只是想写个甚至不需要 Reactivity、甚至没有复杂交互功能的简单网页。 +  +React 里有个概念叫作虚拟 DOM,这就是对真实 DOM 树的额外抽象,如果 DOM 本身足够复杂,操作虚拟 DOM 就会容易管理不少。只不过,在大部分网页开发中,额外的抽象层都是过度抽象,做一个简单的网页也要用脚手架搭一个完整的项目结构也完全是过度工程。更何况这不会让开发效率有质的提升,反而会*显著*拖慢网页的加载速度。 + +JavaScript 开发者还经常被嘲笑热衷于造框架和使用框架, + ## 依赖地狱和供应链投毒 ## 网页交互的越界 |
