的语义var
和let
var
并向let
机器和其他程序员声明:
我打算在执行过程中更改此赋值。不要依赖此分配的最终值。
使用var
和的含义let
var
并let
迫使其他程序员读取从声明到最终使用的所有中间代码,并在程序执行的那一刻说明赋值的原因。
它们削弱了ESLint和其他语言服务的机器推理能力,从而无法在以后的分配中正确检测到类型错误的变量名,并且在内部作用域忘记声明的情况下重新使用外部作用域变量名的作用域。
它们还使运行时在所有代码路径上运行许多迭代,以在对其进行优化之前检测到它们实际上实际上是常量。尽管这比漏洞检测和开发人员易理解性要小。
何时使用 const
如果引用的值在执行过程中没有变化,则表示程序员意图的正确语法为const
。对于对象,更改引用的值意味着指向另一个对象,因为引用是不可变的,但对象不是。
“ const
”对象
对于对象引用,不能将指针更改为另一个对象,但是创建并分配给const
声明的对象是可变的。您可以在const
引用的数组中添加或删除项目,并对const
引用的对象更改属性键。
要实现不可变的对象(这又使代码易于为人和机器推理),可以Object.freeze
在声明/分配/创建处使用该对象,如下所示:
const Options = Object.freeze(['YES', 'NO'])
Object.freeze确实会影响性能,但是由于其他原因,您的代码可能会变慢。您要配置它。
您还可以将可变对象封装在状态机中,并将深层副本作为值返回(这是Redux和React状态的工作方式)。有关如何根据基本原理构建此状态的示例,请参见在Browser JS中避免使用可变的全局状态。
什么时候var
和let
很好的搭配
let
并var
代表可变状态。在我看来,它们应仅用于模拟实际可变状态。诸如“ 连接是否还存在? ”之类的信息。
最好将它们封装在可测试的状态机中,这些状态机公开表示“ 连接的当前状态 ” 的常量值,该常量在任何时间点都是常量,而其余代码实际上是您感兴趣的。
编写副作用和转换数据已经足够困难。通过创建带有变量的可变状态,将每个功能变成不可测试的状态机,只会增加复杂性。
有关更细微的解释,请参见《突变的信徒-案例》const
。