作者dream1124 (全新開始)
看板Soft_Job
標題Re: [討論] 請大家聊聊 JavaScript的缺陷
時間Tue Nov 3 09:46:21 2020
※ 引述《keev (a)》之銘言:
: 而我自己寫JavaScript 覺得寫起來很舒服
: 所以我想請大家提出 JavaScript 哪裡爛
你喜不喜歡是一回事,但儘管我天天寫 ts 仍覺得 js 真的比較爛啊~
: 在近幾年演化的很快
: 例如 es6 增加 let, const語法
這可以說是近年最有用的功能了… 還好有它們不然事情更麻煩
: promise, async await 的出現
: 避免了 callback hell
認真說來這是非同步作業都要面對的議題,不是 js 自己的問題,
但小吐槽一下,promise 只是函式庫… 請不要跟語言混為一談。
async、await 才是語言功能,但那是你 promise 用太兇而順勢衍生出的工具,
不是因為有什麼前瞻的見解而發展出來的功能。
另外值得一提的是…
既然現在人們把 js 當通用語言來用,也開發伺服器端的程式,
那處理到可能發生多種例外的作業,好比說 I/O 時,
你們難道不覺得沒有 throws 語法給開發者事先聲明函式的使用者可能會面對的例外是一項缺陷?
這樣對於使用者來說,他不就要事先看一堆文件才會知道應該設想好哪些問題的對策?
難道有可能發生錯誤的函式你通通都要靠 promise 來回報嗎?
這樣應該比較浪費記憶體空間吧?
還是你覺得只要靠一兩個高層次的 try catch 統一補捉各式 error,
然後再層層呼叫多個函式善後就好?
你這次要再靠 JSDoc 於程式碼的外部聲明例外狀況來緩解這項問題嗎?
(有空去看看這篇文章吧
https://www.yinwang.org/blog-cn/2017/05/23/kotlin )
: TypeScript + JSDoc + vscode
: 則是提供了強型別語言的好處
: 例如 type checking, documentation, 避免null dereference, code navigation 等等
這段是吸引我回文的點
不好意思喔,這些都是 typescript、vscode 的功勞,跟 javascript 無關。
你在用的是 typescript,javascript 仍舊是破破的,請不要幫它攬功。
其他 C-like 通用語言早就可以提供型態資訊給編譯器,
也陸續都可以協助檢查 null pointer 的問題,
拿這些功能出來說嘴只是讓人覺得像是國中生跟大人強調自己已經不是小孩了。
如果你 js 專案不加入 tsconfig,或著不透過文字編譯器、 IDE 提供的機制
向他們說明程式執行環境的資訊,那各類工具支援都難以做得很精準到位。
Facebook 為了解決型態問題還發展出 propTypes 這種鬼東西欸,我看了只覺得呵呵
: 而維護程式碼品質的工具 eslint, prettier
: 分別是 linter 和 code formatter
: 可以避免許多問題
嗯,已知用火…
: 而 commonjs, es module 則是補上了模組功能
: 在這些東西出現前 js的確是很難用
: 所以請大家把討論範圍限定在現代的JavaScript
好啦好啦,你終於長大,已經不是小孩子囉~
你是未來世界的主人翁~ 乖哦~
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.231.183.84 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1604367983.A.10C.html
1F:推 hegemon: 笑死,在蛇蛇圈也是有已知用火的感覺 11/03 10:14
2F:推 alihue: 推推 11/03 10:15
3F:→ stopcrying: 可惜 ts 的 union type 沒有好用到可以取代 exception 11/03 10:16
4F:推 maik060: 漂亮 11/03 10:36
5F:推 newhandfun: 很精闢 11/03 10:49
6F:→ angusyu: 各位觀眾,新一代鄙視鏈已出現! 11/03 10:58
其實我不鄙視 js,畢竟當初發展的時空背景跟現在完全不同,
當年誰能料到瀏覽器輔助開發者的功能會變成現在大家開發應用程式的基礎?
我只是受不了 js、ts 分不清楚就要說 js 好棒棒的論點,這太瞎了。
7F:推 windclara: 感謝TS,不然開發前端面對JS真心痛苦 11/03 10:59
8F:推 vi000246: 說ES6很棒 但是還要打包 考慮不同瀏覽器行為 11/03 11:15
9F:推 keev: promise 是語言的一部分 寫在規格裡 11/03 11:15
10F:→ vi000246: 部署難度差那麼多 我還是覺得js難用 11/03 11:15
12F:→ keev: 如果規格沒有定義 promise 要怎麼定義 async await? 11/03 11:15
13F:推 keev: 型別檢查那段我可能沒寫清楚 11/03 11:34
14F:→ keev: 我指的是 js + JSDoc + tsc checkJS 11/03 11:34
15F:→ keev: 開發時用 tsc檢查型別 11/03 11:34
16F:→ keev: 跑的時候 node.js 直接跑不用編譯 11/03 11:34
17F:→ keev: 在語法上是合格的 js 11/03 11:34
18F:→ keev: 可以說他是 js 也可以說他是 ts 11/03 11:34
好啊,你不是寫 ts,你是寫 js,但這樣就更妙了。
語言是語言,開發工具是開發工具,這是兩回事。
為什麼進步的 tsc 可以拿來為 js 語言護航?
工具都能為語言加分的話,那恐怕會讓 js 被人笑更慘哦~
就算你說工具的進步和語言的進步密切相關,
js 有 let 有 const,有 node 的 cjs 和後面 export import 等概念後,
tsc 抓錯的能力才能大幅提升,但這改變不了 js 語言本身就是比其他語言破,
讓人寫得進階一點就要背一堆特例,記一堆怪異行為,用一堆外部工具輔助的本質啊~
這樣的語言給人抱怨只是剛好而已好不好…
19F:推 kusakawa: promise 是函式庫??定義在 ECMAScript Spec 裡面的是 11/03 11:39
20F:→ kusakawa: 函式庫?? 11/03 11:39
21F:噓 tsao1211: 半瓶水響叮噹 看到promise那段就懶得看了 11/03 11:44
22F:推 chatnoir: 用ts鄙視js XDDDD 11/03 11:51
也不是鄙視,就只是學會 ts 這種能提供 js 型態資訊給開發工具的語言之後,
若非維護舊專案,否則就不想寫純 js 專案了。
講白了現在除非新專案是 node 程式,不然寫給外部使用者的前端純 js 專案還不是要轉譯,
有多少團隊敢假設對方瀏覽器都很新,直接用最新的 ES 語法?
既然都要轉譯,那為啥不寫 ts 就好?
23F:→ chatnoir: promise不是物件嗎? 囧 11/03 11:52
24F:推 vi000246: 可是IE不支援promise捏 訂在spec 瀏覽器不支援還要繞 11/03 11:53
25F:→ vi000246: 一圈 似乎不太方便 11/03 11:53
26F:→ kusakawa: 樓上不覺得這聽起來像是 IE 的問題嗎? 11/03 11:56
27F:→ vi000246: 如果公司要你支援IE 那就變成RD的問題了 11/03 12:00
28F:推 lturtsamuel: 你不想要 exception,go rust c歡迎你 11/03 12:06
29F:→ lturtsamuel: 除了ocaml系列語言 rust kotlin 其他人說要避免空指 11/03 12:08
30F:→ lturtsamuel: 針解引用我都當笑話 11/03 12:08
31F:→ WTFCN: 笑死 11/03 12:35
32F:→ jobintan: 我用react都用tsx取代jsx,ts真的建議去學一下。 11/03 13:13
33F:噓 tz5514: 2020 年還在說 promise 只是函式庫不是語言特性 如果不是 11/03 13:45
34F:→ tz5514: 平行時空就是時空旅人 11/03 13:45
35F:噓 soccer103: Promise 是函式庫? 11/03 18:37
36F:→ dreamnook: typescript寫起來真的頗舒服 11/03 20:41
37F:→ fantasystar: promise/async/await 的部分講錯了 = = 11/03 22:13
38F:推 viper9709: 推 11/04 00:30
39F:→ superpandal: 個人覺得有錯直接回傳狀態 再由其他函數處理比較好 11/04 16:27
這不就是 Go 語言的做法?
很好,以後你去呼叫函式之前都要注意他有沒有可能拋執行期錯誤,
然後不斷檢查有沒有錯誤訊息了。
※ 編輯: dream1124 (118.160.95.12 臺灣), 11/05/2020 14:59:59
40F:→ superpandal: 不需要像go那麼繁複 11/05 16:45
41F:推 sharku: 推ts 11/05 21:04
42F:推 strlen: 推TS就是證明JS就是個垃圾 11/05 23:16