由于 Strong Type + OOP 写起来心里踏实,我平常工作还是习惯 TS > JS,
JavaScript 有它的缺点吗?当然有,每个语言都能被挑出一些毛病,
但我们得先做出区别,什么是真正的“缺点”,什么是“你不了解”。
dream1124 大提出的一点我深有同感:
JavaScript 明明有 try statement、有 throw、也可以定义 exception type,
但却不像 JAVA 一样可以做 multiple exception,如果要辨别是哪个 exception,
就只能蹩脚地使用 "instance of",这确实造成许多开发上的不便。
(目前 proposal 里面也没看到未来有打算支援,如果有的话麻烦提点)
再来是 JavaScript 的 Date 废到笑,也是被大家诟病的地方,让 moment.js 几乎必备
,
(就像 PHP 的 Carbon)
目前有一个叫作 temporal 的 proposal 已经在 stage 2 讨论中,
它提供更现代的 Date API,相信之后能够被改善。
这些确实是语言的缺点,提出这些缺点能够带来正向讨论,
这也是目前 EMCA 的 TC39 正在做的事情:
你觉得这语言哪里还可以增强,提出来大家讨论,如果有共识就写进 Spec
-
再来讨论“你不了解”,你觉得:
true == 1
> true
true === 1
> false
这两行很可笑,只是代表你不懂 JavaScript,这种 meme 在网络社团看到会觉得好笑,
但完全无助于讨论,这只是因为两个等号会触发隐含转型,三个等号不会,
而这些规范全部都写在 ECMAScript Spec 里面。
为什么 91 - "1" = 90?
因为 "+" 运算子的算法步骤中,只要左右有一边是字串,就对双方做 ToString,
而 "-" 运算子少了这个步骤。
https://www.ecma-international.org/ecma-262/11.0/index.html#title
为什么 "+" 运算子要多这一步,Spec 上面也跟你说了:
“加法运算子同时具备字串串接与数值相加的功能。”
我不知道开发 JavaScript 的人有没有看过 Spec,但我希望如果你已经理解语法了,
你可以花时间看看这份 Spec,会让你对这个语言有更多了解,对开发的帮助很大,
隐含转型你只要熟悉它的规则,就能减少冗长的程式码,提高易读性,
在最高的支援度下,新的语法你更要会,像是 ES6 加入很多方便的 Array 方法,
能够省去不少实作的时间。
JavaScript 很好学,但也有一些历史共业留下来的 pitfall (像是那该死的 typeof),
因为它主要的环境是在浏览器上,比起其他语言它更不能做一些破坏向下支援的改动,
举例来说:刚刚我们提到 Temporal 完全是 Date 的威力加强版,
但它能把 Date 拿掉吗 XD?完全不可能,于是 Date 成为下一个历史共业。
试着更加理解 JavaScript,避开 Pitfall,就能写出更高品质的程式码