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