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