Re: [讨论] 请大家聊聊 JavaScript的缺陷

楼主: kusakawa (草川)   2020-11-03 12:52:14
由于 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,就能写出更高品质的程式码
作者: lturtsamuel (港都都教授)   2020-11-03 12:55:00
多写几个toString vs 被奇怪的隐式转型吓到 我选前者
作者: jobintan (Robin Artemstein)   2020-11-03 13:14:00
TypeScript表示安定…
作者: strlen (strlen)   2020-11-03 13:43:00
看这些spec一点意义也没有 浪费时间记那些例外和隐含转型还不如强型别 把心思花在商业逻辑上
作者: ChangeXD (欠举)   2020-11-03 13:58:00
菜鸟如我看你们争论的时候拿笔记一直抄
作者: winniekuma (Kuma)   2020-11-03 13:58:00
拿spec当大招放真的挺趣味
作者: vi000246 (Vi)   2020-11-03 14:24:00
"你只要熟悉它的规则,就能减少冗长的程式码"换句话说 很容易接手前人写的烂扣 或是合作的人写烂扣
作者: WTFCN (WTFCN)   2020-11-03 14:31:00
推楼上,TS再好都还是会有人把变量通通宣告为any
作者: cha122977 (CHA)   2020-11-03 15:02:00
虽然+/-的不同是因为字串能用+来接 但这设计真的很糟
作者: ericrobin   2020-11-03 15:02:00
就是很多人觉得这些规则鸟才说他缺陷阿= =
作者: cha122977 (CHA)   2020-11-03 15:03:00
因为直觉上会认为+-*/会有类似行为但实际上+就是一个特例 所以才要特别写在spec解释别的语言通常直接让-*/不能用在字串 就省去这方面问题
作者: cooper6334 (库波)   2020-11-03 15:56:00
这些楣楣角角就是坑阿,
作者: askaleroux (FalconTW)   2020-11-03 18:51:00
人家+-没问题 就你js问题最多 这不就坑?
作者: alihue (wanda wanda)   2020-11-03 18:53:00
算把 spec 写烂了
作者: wulouise (在线上!=在电脑前)   2020-11-03 19:02:00
一堆方便带来不方便
作者: vi000246 (Vi)   2020-11-03 19:05:00
把bug写进spec就变feature了
作者: iq1000x (台串彭于晏)   2020-11-03 19:39:00
可是true+true+true===3
作者: panbanana (香蕉猴子)   2020-11-03 20:12:00
moment.js 现在已经....
作者: dreamnook (亚龙)   2020-11-03 20:42:00
现在都不太用moment.js了 太肥…
作者: handsomeburg (韩森堡)   2020-11-03 20:48:00
推推,用弱型别语言嫌它不是强型别是怎样?
作者: CoNsTaR ((const *))   2020-11-03 23:08:00
看到“例外处理”、“隐含转型”什么的还讲得头头是道必须嘘
作者: opallin (Opal_Lin)   2020-11-03 23:10:00
不用解释吧 反正拿不拿spec出来讲都会有人酸
作者: CoNsTaR ((const *))   2020-11-03 23:11:00
弱型别、OO 到 2020 还存在本身就是一个 shame
作者: crazylunar (橘色光束)   2020-11-04 00:20:00
感觉就是我坑都写在spec了,摔进去就不干我的事一样
作者: newhandfun (新手方)   2020-11-04 00:54:00
把bug写进spec就变feature了+1
作者: s06yji3 (阿南)   2020-11-04 01:07:00
我也觉得是把缺陷写进spec当做features...
作者: internetms52 (Oaide)   2020-11-04 08:11:00
推前几楼,把bug写进spec...
作者: brianhsu (坟墓)   2020-11-04 10:31:00
把缺陷写近 SPEC,他还是缺陷。C 语言用非零和零当作 True / False 也是在 SPEC 内,但他一样是缺陷。
作者: EPGo   2020-11-04 13:24:00
moment.js 已停止更新,很久前就改用轻量的 day.js
作者: strlen (strlen)   2020-11-04 13:37:00
It's not a bug; it's feature.
作者: superpandal   2020-11-04 16:48:00
确实不难了解的东西
作者: wulouise (在线上!=在电脑前)   2020-11-04 20:22:00
看起来JS比C++好太多了,C++都马是说这个UB我不管JS还有定义这是spec,感恩
作者: superpandal   2020-11-04 21:46:00
看来确实很多c/c++的会用js 现在js效能也不错
作者: viper9709 (阿达)   2020-11-05 00:47:00
推一楼
作者: abraxas (Abr.)   2020-11-05 12:38:00
虽然说明书可以解决问题,但不是只要写到说明书就合理了
作者: su321752a (小雷)   2020-11-08 18:50:00
只能推了

Links booklink

Contact Us: admin [ a t ] ucptt.com