https://eslint.org/docs/rules/prefer-const
https://www.zhihu.com/question/60625915
https://reactjs.org/tutorial/tutorial.html#storing-a-history
今天在看react官方的Tutorial時,發現demo里大多數地方用的都是const而不是let,代碼里不可能到處定義常量吧。。。讓我困惑不已!!!!
雖然demo里被const標記的變量都是引用類型的,在ES6語法中並不會報錯,但是從字面意思上看const 是代表常量——不變的意思,官方這樣寫不怕讀者感到奇異嗎?
於是在網上搜了一些資料,才發現:
在c#中,const定義的常量是不能做任何修改的。
而在ES6中,原則應該是:能用 const 就應該用 const。比如開啟 eslint 的 prefer-const 的 rule。
有一些人,因為覺得 const 表示常量,而實際上並不是常量,所以認為不應該用。這是一種因果倒置。
固然在一些語言里,const 表示的是編譯期常量,但是也有不少語言里 const 表示的就是不可變,和 js 里的 const 意義是一致的。比如 C++。
我雖然確實認為 js 用 const 關鍵字表達這個語義(以及用 let 表示可變)不是最佳選擇,但是畢竟這只是一個語法上的小節,對程序員來說,並沒有什么難以掌握的。
如果說,使用了 const 產生誤解,說明(誤解它的程序員)沒有正確理解 const 的語義。正確的對策是教育,而不是遷就。
至於說還想表達 immutable array / object,目前在原生 js 里沒有很好的辦法(雖然可以用 Object.freeze/seal 之類的),確實如此。但是缺乏某一種特性難以構成不使用另一種特性的理由。況且如果真的認為這意義重大,可以用 typescript(readonly 類型)。
ES6中正確的邏輯應該是:
你認為它不應該被重新定義,使用const;
你需要它完全不可改變,用Object.freeze或者typescript的readonly;
而不是:
我希望它不可變,然而用const之后它還是可變,所以不用const
