选择如何更好地利用ES6 const并让它

cFr*_*eed 9 javascript ecmascript-6

免责声明:我知道下面的问题可能被视为"征求意见"(因此它不属于主题).
但事实并非如此:我正在寻找在考虑这一点时应该考虑的利弊事实.

我只是阅读(来自优秀的探索ES6)一个关注constvs letvsvar的摘录,其中结论表明(粗体是我的):

然后我们有两种方法:

  1. 首选const:const标记不可变绑定.
  2. 首选let:const标记不可变的.

我略微倾向于#1,但#2也很好.

让我感到困惑的是:这种偏好似乎是基于两种方法之间产生的差异的深层技术意义,好像作者感到基本上关注代码如何在低级别工作.

但是我也感到担心(也许是第一个!)可读性方面:从这个角度来看,#2似乎更好地使代码在处理数据发生的事情上更具语义意义.

但也许我错过了#1选择的一些优势......?


编辑,利用建议重复的链接:为什么大多数时候我应该使用const而不是让javascript?

事实上,对这个问题的公认答案实际上是以这样一种方式暴露事物,而不是强迫我遵循我以前的观点,即#2胜过#1.

顺便说一句,我意识到我的问题可能不是那么清楚,所以这里有一个更详细的重写:

  • 我是很清楚的(据我所知)所有的技术差异constlet,所以我的问题并没有询问有关的事情.
  • #1和#2之间的选择真正涉及的唯一一点在于使用任何不可变对象(尽管其内容可能会被更改!)vs 仅用于冻结对象.const

在那里,我很惊讶作者更喜欢#1,因为(从我的观点来看)这是相当误导的.
使用对象的最常见方式是它们的内容在此过程中发生变化,因此const如果使用#1,则在其声明级别读取:

  • 充其量我们不知道应该发生什么.
  • 在最坏的情况下,我们可以想象它的内容永远不会改变,而它可以!

另一方面,选择使用#2,我们可以相信 - 声明的const对象不会改变(实际上除了疏忽和/或错误).

所以回到我的问题:由于上面的反思似乎显然导致选择#2,我想知道我可能错过了哪一点,这使得作者更喜欢#1.

Rom*_*tor 7

为了与你追求事实的旅程保持一致,我将避免陈述观点并用客观,简单的术语描述我的答案.

作者的偏好不是基于"深刻的技术意义",因为重要性实际上相当浅:简而言之,两个关键字之间的唯一区别是const变量不能被重新分配,而let变量可以.

首选项#1的目的是以定义它的特定方式使用const,从而防止将变量指向新的赋值.

偏好#2的意图是假装(或行动)像任何初始化const变量的RHS值是不可变的,这需要开发人员努力知道并相应地采取行动.

#2的一个缺点是它引入了一个用const编码的约定,它与它的实际功能不一致,所以它主要是编码标准和代码维护的问题.换句话说,如果开发团队规定const必须仅用于不可变声明,那么它将使代码更容易理解,不应修改这些值,但事实上并非如此,它们无法被修改.(如果要遵循这个约定,那么const只能用于实际上不可变的值,例如,使用Object.freeze().)

#1的优点是你正在使用const设计:你正在处理这些变量,好像它们的赋值不能被改变,而不是假装const提供它没有提供的东西(即不变性),所以没有开发人员错误地修改他们应该假装的const对象的内容的可能性无法修改.