Re: [討論] 請大家聊聊 JavaScript的缺陷
由於 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://www.ptt.cc/bbs/Soft_Job/M.1604379138.A.04F.html
推
11/03 12:55,
3年前
, 1F
11/03 12:55, 1F
※ 編輯: 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
→
11/03 13:14,
3年前
, 2F
11/03 13:14, 2F
→
11/03 13:43,
3年前
, 3F
11/03 13:43, 3F
→
11/03 13:43,
3年前
, 4F
11/03 13:43, 4F
哎呀我只是寫程式的,我們關注的點不一樣而已啦。
推
11/03 13:58,
3年前
, 5F
11/03 13:58, 5F
推
11/03 13:58,
3年前
, 6F
11/03 13:58, 6F
winnie 大,我的意思不是把 spec 丟在桌上然後指責大家亂罵 JavaScript,
我覺得大家好像買了 JavaScript 牌的電器,然後用過去使用他牌電器的經驗來操作它,
雖然它會動,但一定還是覺得哪裡怪怪的,怎麼預期行為跟過去的經驗抵觸。
其實這個問題可以從「看說明書」去解決,Spec 裡面不只記載演算步驟,時常也有記載
為什麼要這樣做的 note。
※ 編輯: kusakawa (1.169.214.175 臺灣), 11/03/2020 14:07:14
推
11/03 14:24,
3年前
, 7F
11/03 14:24, 7F
→
11/03 14:24,
3年前
, 8F
11/03 14:24, 8F
不遵守規範的 code 淪為爛 code 只是時間問題,沒經過 PEP 8 跟 LINT 的 Python cod
e 一樣很糟,無論什麼程式語言都需要規範,都需要 pattern。
推
11/03 14:31,
3年前
, 9F
11/03 14:31, 9F
※ 編輯: kusakawa (1.169.214.175 臺灣), 11/03/2020 14:36:09
→
11/03 15:02,
3年前
, 10F
11/03 15:02, 10F
→
11/03 15:02,
3年前
, 11F
11/03 15:02, 11F
→
11/03 15:03,
3年前
, 12F
11/03 15:03, 12F
→
11/03 15:03,
3年前
, 13F
11/03 15:03, 13F
→
11/03 15:04,
3年前
, 14F
11/03 15:04, 14F
推
11/03 15:56,
3年前
, 15F
11/03 15:56, 15F
→
11/03 18:51,
3年前
, 16F
11/03 18:51, 16F
推
11/03 18:53,
3年前
, 17F
11/03 18:53, 17F
推
11/03 19:02,
3年前
, 18F
11/03 19:02, 18F
→
11/03 19:05,
3年前
, 19F
11/03 19:05, 19F
推
11/03 19:39,
3年前
, 20F
11/03 19:39, 20F
推
11/03 20:12,
3年前
, 21F
11/03 20:12, 21F
→
11/03 20:42,
3年前
, 22F
11/03 20:42, 22F
推
11/03 20:48,
3年前
, 23F
11/03 20:48, 23F
推
11/03 22:28,
3年前
, 24F
11/03 22:28, 24F
噓
11/03 23:08,
3年前
, 25F
11/03 23:08, 25F
→
11/03 23:08,
3年前
, 26F
11/03 23:08, 26F
推
11/03 23:10,
3年前
, 27F
11/03 23:10, 27F
噓
11/03 23:11,
3年前
, 28F
11/03 23:11, 28F
→
11/04 00:20,
3年前
, 29F
11/04 00:20, 29F
推
11/04 00:54,
3年前
, 30F
11/04 00:54, 30F
噓
11/04 01:07,
3年前
, 31F
11/04 01:07, 31F
推
11/04 08:11,
3年前
, 32F
11/04 08:11, 32F
推
11/04 10:31,
3年前
, 33F
11/04 10:31, 33F
→
11/04 10:31,
3年前
, 34F
11/04 10:31, 34F
→
11/04 13:24,
3年前
, 35F
11/04 13:24, 35F
→
11/04 13:37,
3年前
, 36F
11/04 13:37, 36F
→
11/04 16:48,
3年前
, 37F
11/04 16:48, 37F
→
11/04 20:22,
3年前
, 38F
11/04 20:22, 38F
→
11/04 20:23,
3年前
, 39F
11/04 20:23, 39F
→
11/04 21:46,
3年前
, 40F
11/04 21:46, 40F
→
11/05 00:47,
3年前
, 41F
11/05 00:47, 41F
推
11/05 12:38,
3年前
, 42F
11/05 12:38, 42F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 19 篇):