作者kusakawa (草川)
看板Soft_Job
标题Re: [讨论] 请大家聊聊 JavaScript的缺陷
时间Tue Nov 3 12:52:14 2020
由於 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,就能写出更高品质的程式码
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 1.169.214.175 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1604379138.A.04F.html
1F:推 lturtsamuel: 多写几个toString vs 被奇怪的隐式转型吓到 我选前者11/03 12:55
※ 编辑: kusakawa (1.169.214.175 台湾), 11/03/2020 12:59:08
如果每个都要写 toString 的话,那好像还是转到 strong-typed 比较快 XD,哈哈,
JavaScript 的隐含转型其实并不奇怪,数来数去也就 ToString, ToNumber, ToBoolean
这几个比较主要而已。
※ 编辑: kusakawa (1.169.214.175 台湾), 11/03/2020 13:06:40
2F:→ jobintan: TypeScript表示安定…11/03 13:14
3F:→ strlen: 看这些spec一点意义也没有 浪费时间记那些例外和隐含转型 11/03 13:43
4F:→ strlen: 还不如强型别 把心思花在商业逻辑上11/03 13:43
哎呀我只是写程式的,我们关注的点不一样而已啦。
5F:推 ChangeXD: 菜鸟如我看你们争论的时候拿笔记一直抄11/03 13:58
6F:推 winniekuma: 拿spec当大招放真的挺趣味 11/03 13:58
winnie 大,我的意思不是把 spec 丢在桌上然後指责大家乱骂 JavaScript,
我觉得大家好像买了 JavaScript 牌的电器,然後用过去使用他牌电器的经验来操作它,
虽然它会动,但一定还是觉得哪里怪怪的,怎麽预期行为跟过去的经验抵触。
其实这个问题可以从「看说明书」去解决,Spec 里面不只记载演算步骤,时常也有记载
为什麽要这样做的 note。
※ 编辑: kusakawa (1.169.214.175 台湾), 11/03/2020 14:07:14
7F:推 vi000246: "你只要熟悉它的规则,就能减少冗长的程式码"11/03 14:24
8F:→ vi000246: 换句话说 很容易接手前人写的烂扣 或是合作的人写烂扣11/03 14:24
不遵守规范的 code 沦为烂 code 只是时间问题,没经过 PEP 8 跟 LINT 的 Python cod
e 一样很糟,无论什麽程式语言都需要规范,都需要 pattern。
9F:推 WTFCN: 推楼上,TS再好都还是会有人把变数通通宣告为any 11/03 14:31
※ 编辑: kusakawa (1.169.214.175 台湾), 11/03/2020 14:36:09
10F:→ cha122977: 虽然+/-的不同是因为字串能用+来接 但这设计真的很糟 11/03 15:02
11F:→ ericrobin: 就是很多人觉得这些规则鸟才说他缺陷阿= = 11/03 15:02
12F:→ cha122977: 因为直觉上会认为+-*/会有类似行为 11/03 15:03
13F:→ cha122977: 但实际上+就是一个特例 所以才要特别写在spec解释 11/03 15:03
14F:→ cha122977: 别的语言通常直接让-*/不能用在字串 就省去这方面问题 11/03 15:04
15F:推 cooper6334: 这些楣楣角角就是坑阿, 11/03 15:56
16F:→ askaleroux: 人家+-没问题 就你js问题最多 这不就坑? 11/03 18:51
17F:推 alihue: 算把 spec 写烂了 11/03 18:53
18F:推 wulouise: 一堆方便带来不方便 11/03 19:02
19F:→ vi000246: 把bug写进spec就变feature了 11/03 19:05
20F:推 iq1000x: 可是true+true+true===3 11/03 19:39
21F:推 panbanana: moment.js 现在已经.... 11/03 20:12
22F:→ dreamnook: 现在都不太用moment.js了 太肥… 11/03 20:42
23F:推 handsomeburg: 推推,用弱型别语言嫌它不是强型别是怎样? 11/03 20:48
24F:推 netburst: 11/03 22:28
25F:嘘 CoNsTaR: 看到“例外处理”、“隐含转型”什麽的还讲得头头是道必 11/03 23:08
26F:→ CoNsTaR: 须嘘 11/03 23:08
27F:推 opallin: 不用解释吧 反正拿不拿spec出来讲都会有人酸 11/03 23:10
28F:嘘 CoNsTaR: 弱型别、OO 到 2020 还存在本身就是一个 shame 11/03 23:11
29F:→ crazylunar: 感觉就是我坑都写在spec了,摔进去就不干我的事一样 11/04 00:20
30F:推 newhandfun: 把bug写进spec就变feature了+1 11/04 00:54
31F:嘘 s06yji3: 我也觉得是把缺陷写进spec当做features... 11/04 01:07
32F:推 internetms52: 推前几楼,把bug写进spec... 11/04 08:11
33F:推 brianhsu: 把缺陷写近 SPEC,他还是缺陷。C 语言用非零和零当作 Tr 11/04 10:31
34F:→ brianhsu: ue / False 也是在 SPEC 内,但他一样是缺陷。 11/04 10:31
35F:→ EPGo: moment.js 已停止更新,很久前就改用轻量的 day.js 11/04 13:24
36F:→ strlen: It's not a bug; it's feature. 11/04 13:37
37F:→ superpandal: 确实不难了解的东西 11/04 16:48
38F:→ wulouise: 看起来JS比C++好太多了,C++都马是说这个UB我不管 11/04 20:22
39F:→ wulouise: JS还有定义这是spec,感恩 11/04 20:23
40F:→ superpandal: 看来确实很多c/c++的会用js 现在js效能也不错 11/04 21:46
41F:→ viper9709: 推一楼 11/05 00:47
42F:推 abraxas: 虽然说明书可以解决问题,但不是只要写到说明书就合理了 11/05 12:38
43F:推 su321752a: 只能推了 11/08 18:50