作者keev (a)
看板Soft_Job
標題[討論] 請大家聊聊 JavasScript的缺陷
時間Mon Nov 2 23:36:38 2020
https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1602985969.A.989.html
看了這篇文發現有不少人討厭 JavaScript
而我自己寫JavaScript 覺得寫起來很舒服
所以我想請大家提出 JavaScript 哪裡爛
我會試著反駁 互相交流
首先我要說 JavasSript 又稱做 ECMAScript
在近幾年演化的很快
例如 es6 增加 let, const語法
避免了 var的麻煩
promise, async await 的出現
避免了 callback hell
js + JSDoc + tsc --checkJS
則是提供了強型別語言的好處
例如 type checking, documentation, 避免null dereference, code navigation 等等
而維護程式碼品質的工具 eslint, prettier
分別是 linter 和 code formatter
可以避免許多問題
而 commonjs, es module 則是補上了模組功能
在這些東西出現前 js的確是很難用
所以請大家把討論範圍限定在現代的JavaScript
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 27.242.67.104 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1604331400.A.F6D.html
※ 編輯: keev (27.242.67.104 臺灣), 11/02/2020 23:38:07
1F:推 er230059: this都到處亂指XD 11/02 23:57
2F:→ er230059: 其實是個人常常腦洞 settimeout忘記this會被改QQ 11/02 23:57
3F:→ stopcrying: async/await 只能用在 promise 上,不能用在其他類似 11/03 00:03
4F:→ stopcrying: 的結構上有點可惜 11/03 00:03
5F:→ JingJing00: 能動就好爛code數量:js第一php第二python急追中 11/03 00:04
6F:推 vi000246: 還要學打包工具 好麻煩 11/03 00:22
7F:推 s06yji3: 要打包真的好麻煩,參數也太多太細。 11/03 00:31
8F:推 fiiox3: 打包真的.....從來不覺得自己懂過XD 11/03 00:34
9F:→ forewero: 不就是因為難用才那麼多檢查工具?typeof nan = num... 11/03 00:51
NaN 是 IEEE 754 (浮點數標準) 定義的一個數
在 java 和 go裡 NaN 的型別也是浮點數
而 js的 number就是 float64
這樣來看 typeof NaN === "number" 算是合理八?
11F:→ newhandfun: =jpg 11/03 00:56
※ 編輯: keev (36.231.154.156 臺灣), 11/03/2020 01:29:36
12F:推 GLaDOS1105: 要學的東西一堆 動不動就大更新 11/03 01:17
13F:推 EPGo: typeof [] 11/03 01:28
14F:推 hermes018: 喜歡 JavaScript,不過也沒寫過其他語言,也無法比較 11/03 01:44
15F:推 lturtsamuel: 有沒有看過this用bind綁定成亂七八糟的值 你想要綁正 11/03 01:52
16F:→ lturtsamuel: 確的反而出bug 11/03 01:52
17F:推 iq1000x: 要學文內那麼多東西就是缺點啊 11/03 02:04
18F:推 lturtsamuel: 文內那些東西還是很簡單的 那些也叫難你要c++工程師 11/03 02:07
19F:→ lturtsamuel: 怎麼辦 11/03 02:07
20F:→ cha122977: 個人觀點 難學的點是很多東西不可預期 11/03 02:08
21F:→ cha122977: this很難判斷現在是誰 用+連的東西放前後不同結果 11/03 02:09
22F:推 SHANGOYANYI: 太多流派造成選擇障礙症 看那精美的jQuery/ng/react/ 11/03 02:12
23F:→ SHANGOYANYI: vue/vanilla以及各自衍生的套件跟生態系... 11/03 02:12
24F:→ cha122977: 很多東西用到要寫個小程式測 然後幾週後就忘了 11/03 02:12
25F:→ cha122977: 搞不清楚它的邏輯脈絡 搞的像要背一堆例外情況… 11/03 02:13
26F:推 tsao1211: 因為大部分人js都不紮實才覺得難用 11/03 03:01
27F:推 imega: 嚴格模式可避免this亂指 11/03 05:32
28F:推 windclara: 有時忘記寫await,輸出不如預期花很多時間Debug才想到= 11/03 07:33
29F:→ windclara: = 11/03 07:33
30F:推 brianhsu: 濃縮成一句話就是例外太多,行為不一致吧! 11/03 07:36
31F:推 JavaScript: 好啦! 我就是難搞...哪一次不搞滴 11/03 07:50
32F:推 alihue: 天生的限制導致要各種第三方工具來打包和協助管理 11/03 07:50
33F:推 alihue: 後天用第三方套件軟體協助開發,跟天生就內建的方便程度 11/03 07:53
34F:→ alihue: 差太多了。 11/03 07:53
35F:推 johnny055279: 就是爛才一堆框架跟延伸模組出現啊?你看看python, 11/03 08:43
36F:→ johnny055279: 嘻嘻 11/03 08:43
37F:推 JavaScript: 樓上想法負面,雖然難精,但是因大家喜愛才會延伸出許 11/03 08:51
38F:→ JavaScript: 套件出來才對怎麼可以說是爛...嘖嘖 11/03 08:51
39F:→ paint: 是不是該來註冊一下ECMAScript惹 11/03 08:58
40F:→ godddddd: 名稱比java長 11/03 09:05
41F:→ adsl12367: 長出太多奇奇怪怪的東西了 11/03 09:21
42F:→ ssccg: java不會運算一下自己變成NaN,會是exception,NaN只是個常 11/03 09:39
43F:→ ssccg: 數,跟javascript會自己冒出NaN根本不一樣 11/03 09:39
44F:→ askaleroux: 套件太多派系太多 動不動就大改 第三方爛掉的套件超 11/03 09:42
45F:→ askaleroux: 多 11/03 09:42
46F:→ askaleroux: 寫過Go現在去寫Js感覺真是不舒服 11/03 09:45
47F:推 abc0922001: 1+1=11 11/03 10:06
48F:噓 alongalone: 我是會推薦你去寫看看 c, C++, C# 跟 java啦.. 11/03 10:32
49F:推 alihue: 忘了還有 node module 黑洞,這根本是語言缺陷導致的 11/03 10:50
50F:→ odahawk: 使用浮點數的時候小數點以下是零的話就自動轉整數 11/03 11:07
51F:推 aidansky0989: js不錯,比Java好寫多了 11/03 11:16
52F:推 satanbaby: 語法再怎麼甜 也終究是JS 11/03 11:22
54F:推 Gaitz: 太自由 有歷史包袱 11/03 11:53
※ 編輯: keev (36.231.154.156 臺灣), 11/03/2020 11:57:38
55F:→ johnny055279: 現在是因為被定型了,重新開始誰還想用JS 11/03 12:03
56F:→ johnny055279: 拜框架所賜現在才比較沒這麼多莫名其妙的問題存在 11/03 12:07
57F:推 sniper2824: 笑死== 11/03 13:05
58F:推 sky40280: 你都說啦,設計不良要靠一堆新的規範來強化 11/03 14:13
59F:推 jinmin88: 雖然有async await, 但是一堆舊的lib沒promise版本阿 11/03 15:48
60F:→ Darkword1987: 不是討厭JS 是討厭csfgsj 11/03 16:32
61F:→ lachtchlee: 人家就是把它設計為弱型別的語言 免得在網絡上一再撞 11/03 16:50
62F:→ lachtchlee: 牆喊暫停 它原本就不是強型別的語言(這不是它的錯) 大 11/03 16:54
63F:→ lachtchlee: 可不必拿它跟ts比 這只是子集 超集的關係而已 11/03 16:57
64F:推 opallin: NaN一直代表invalid number吧 是很多人會錯意以為是什麼n 11/03 17:16
65F:→ opallin: on-exist 11/03 17:16
66F:→ atst2: NaN是Not a Number 的縮寫。 11/03 18:04
67F:→ atst2: type of NaN == “number” 不覺得語意上就有問題嗎? 11/03 18:05
68F:→ askaleroux: 然後很多是typescript幫js擦屁股還有vscode的extensi 11/03 18:48
69F:→ askaleroux: on 你是多菜覺得linter formatter內建在js 11/03 18:48
70F:推 jj0321: 搜尋 javascript meme 那些就是我的困擾 11/03 19:58
71F:推 samioplg: 今天寫ng event.target.value幫我把number 轉成string 11/03 20:08
72F:→ samioplg: 找了半小時,幹 11/03 20:08
73F:推 panbanana: this都亂指,arrow function 跟一般的function 又不一 11/03 20:08
74F:→ panbanana: 樣了 11/03 20:08
75F:噓 MyNion: JavaScript就是個拉基語言,會覺得它有趣或優美的人 11/03 21:54
76F:→ MyNion: 大概沒有接觸過其他有「嚴謹邏輯」的語言 11/03 21:54
77F:推 chatnoir: this 沒有亂指, 是你沒有好好了解過他.. 11/03 22:23
78F:→ netburst: js不錯,比Java好寫多了 11/03 22:23
79F:推 CoNsTaR: @某L 就是因為弱型別才會在執行期“撞牆喊停”吧 11/03 22:40
80F:→ CoNsTaR: 你看過哪個 Haskell 或 Agda 程式跑到一半跟你講發生“ 11/03 22:40
81F:→ CoNsTaR: 例外”的?快笑死 11/03 22:40
82F:→ CoNsTaR: 例外處理本身就是個弱智的想法 11/03 22:40
83F:→ CoNsTaR: 在電腦的世界所有的值都是可預期的,才沒有所謂的“例外 11/03 22:40
84F:→ CoNsTaR: ” 11/03 22:40
85F:→ CoNsTaR: 會有例外除非你 RAM 滿了,CPU 燒掉了,硬碟故障了... 11/03 22:40
86F:推 CoNsTaR: @某 opa,所以 NaN 到底是不是 Number? 11/03 22:48
87F:→ CoNsTaR: 如果一個函數跟你講它會回傳給你一個數字,結果給你一個 11/03 22:48
88F:→ CoNsTaR: NaN 你有什麼感想 XDDD 11/03 22:48
89F:→ CoNsTaR: 幹嘛不一開始就好好寫好 f : Num n Maybe n 11/03 22:48
90F:→ CoNsTaR: 或 f() -> Option<N> where N: Num 呢? 11/03 22:48
91F:推 CoNsTaR: * f : Num n => Maybe n 11/03 22:59
92F:→ CoNsTaR: 不能用 unicode 符號? 11/03 22:59
93F:→ x246libra: JS 太自由 沒規範 動態又弱型別 覺得好寫的 不是高手 11/03 23:13
94F:→ x246libra: 就是新手 一般程式的程度 都會覺得很多莫名例外要背.. 11/03 23:14
95F:推 guitarcho: Swift 歡迎你 11/04 03:19
96F:推 oao1002: 求別更新了...老子學不動了... 11/04 07:42
97F:推 max241: 看完推文 感覺就是常見的不懂xxx 就說xxx不好用 難用 ㄏㄏ 11/04 10:06
98F:→ strlen: 難用就是難用 懂了還是覺得難用 垃圾還有人要護航 今天是 11/04 13:38
99F:→ strlen: 沒辦法大家被逼著用 不然滿大街的JS加強版是哪來的?不就 11/04 13:39
100F:→ strlen: 是JS太垃圾太難用? 11/04 13:39
101F:→ dreamnook: js的優勢是跑在browser上 很會能看到效果 11/04 14:55
102F:→ dreamnook: 然後就(誤 11/04 14:55
103F:推 dream1124: 推 strlen。說出我發文的心情。北七的東西就別再護航了 11/04 15:50
104F:→ superpandal: 很少 個人不喜歡類型 有了類型就要拋錯 方程處理數據 11/04 16:18
105F:→ superpandal: 足夠了 能夠講的大概就寫起來太醜 不過這還是得看人 11/04 16:19
106F:→ nh60211as: 不是吧,沒有型別就不會有型別錯誤的意思嗎 11/04 16:21
107F:→ superpandal: 當然會有錯 但你需要定位所有錯誤的原因嗎? haha 11/04 16:30
108F:推 v7q4: 純Javascript沒問題,有問題的是那些有的沒的框架 11/04 19:29
109F:→ dream1124: 要不要拋錯是可以透過語言的規格設計去改變做法的 11/04 19:45
110F:→ dream1124: 但一個高階語言一開始不提供機制給人宣告型態 11/04 19:46
111F:→ dream1124: 後面再用文件或註解去補往往就悲劇了 11/04 19:47
112F:→ dream1124: 一不小心就是整個社群一堆雜七雜八難懂的標準 11/04 19:47
113F:→ dream1124: 更別提你不想安排所有錯誤的處理對策不代表一個都不做 11/04 19:49
114F:→ dream1124: 更不代表像 js 那樣還會自動幫你轉型或進行一堆運算 11/04 19:50
115F:→ dream1124: 這麼不愛型態怎麼不去寫 Assembly 啊 11/04 19:51
116F:→ superpandal: 給你型態 會寫的如同亂碼的一樣很難懂 方不方便維護 11/04 21:42
117F:→ superpandal: 與有沒有型態根本是兩件事情 確實有錯誤需要處理 但 11/04 21:42
118F:→ superpandal: 主要錯誤才是重點吧 只能說這是每個人的選擇 11/04 21:43
119F:推 hanklgs: null >= 0 11/04 21:58
120F:噓 ruthertw: js抄書隨便亂兜,就可以擔任總經理,你說這語言嘿 11/05 08:40
121F:噓 ruthertw: 台灣眾多小型公司慣老闆超愛js,覺得此語言萬能 11/05 08:42
122F:→ strlen: 就是純JS問題一大堆 才發明出那些有的沒的框架吧? 11/05 23:16
123F:推 CoNsTaR: @superpandal 沒給型態才像亂碼好嗎 11/06 08:49
124F:→ CoNsTaR: f = \x y. x $ map g y 11/06 08:49
125F:→ CoNsTaR: 請問你要花多少時間確認怎麼用 f 和 f 回傳的東西? 11/06 08:49
126F:→ CoNsTaR: 或甚至是確認上述程式是不是正確的? 11/06 08:49
127F:→ CoNsTaR: 如果我告訴你它的 type 是 11/06 08:49
128F:→ CoNsTaR: f : (List String -> String) -> List Integer -> String 11/06 08:49
129F:→ CoNsTaR: 不用兩秒,你大概連 g 是做什麼的都猜到了吧 11/06 08:49
130F:→ superpandal: 這是你定的? @_@ 11/06 14:53
131F:→ superpandal: 只能說這就是人生 總經理... 好遙遠的位置 11/06 14:54
132F:→ ssdoz2sk: NaN === NaN // false | WTF? 11/10 13:08
133F:推 dryadd44651: 很簡單的道理我寫python可以完全專心在我要做的事情 11/19 14:58
134F:→ dryadd44651: 上 11/19 14:58
135F:→ dryadd44651: js注意力都在找bug 跟個白癡一樣 11/19 14:58
136F:→ dryadd44651: 為什麼要浪費生命 11/19 14:58
137F:推 justben: 回到這篇創始戰文打個卡 11/23 16:53
138F:推 imjeffreylee: Js bug超多的啊... 01/09 21:42