我正在阅读TypeScript Deep Dive,我发现let
和const
都是块范围的,这很棒。显然,const不能改变(它是不可变的)。但是为什么ReSharper鼓励我尽可能多地将let
更改为const
?我假设ReSharper认为使用const
超过let
会有性能提升? const
和let
之间是否存在速度差异?使用const
有不同的理由吗?请看以下示例:
for (let i = 0; i < this.InputControl.ParentQuestions.length; i++) {
const id = this.InputControl.ParentQuestions[i].ParentId;
const value = this.InputControl.ParentQuestions[i].ParentRequiredAnswer;
if (!formVals[id]) return false;
if (formVals[id].toLowerCase() != value.toLowerCase()) return false;
}
以前,我有let id
和let value
,但ReSharper要求我将它们更改为const
,这有效,但为什么在这种情况下更好?或者无论如何?
我还找到了this question on SO,但它更多地讨论了let
和const
做了什么,而不是为什么一个比另一个好。它确实尽可能地使用const
,但它提供了什么好处?
答案 0 :(得分:22)
我同意Giorgi表现不是主要原因。代码分析器也可以确定用let
声明的变量不会被重新分配并优化它,就像你用const
声明它一样。 (哎呀,linters有规则来检测这个,并建议使用const
代替let
。)
是的,它确实向读者发出了你不会分配给变量的信号。 const
的好处,而不是发表同样的评论,主要是const
是发信号的标准方式。作为标准,它比定制注释更容易传输信息。 (另外,评论可能有误,但const
不会让你错。)我不认为这是主要的好处。
“最小特权原则”通常与const
一起使用,但为什么我应该关心最小特权?因为有助于及早发现编码错误。请考虑以下代码:
function findSomethingInDocument(document) {
let tree = getTreeFromDocument(document); // We get some sort of tree structure.
let found;
for (const child of tree.children) {
if (child.someFlag) {
tree = child; // Oops I meant found = child :(
break;
}
}
return found;
}
在此代码中,当我打算输入tree = child
时,我输入了found = child
。是的,可以在测试中找到 的错误。但为什么要等待测试?我从未想过要改变tree
。如果我将其标记为const
,那么我会让立即学习错误,因为编译器会告诉我它。我不必等待测试。上面的代码相当简单,但想象一下使用更多变量的更复杂的算法。
答案 1 :(得分:8)
如果您有一个可以声明为const
的变量,并且您将其声明为此类,则告知读者您以后不打算将其重新分配给其他值。
此外,通过声明变量const
,这意味着您已经预先考虑过您不打算重新分配它,这反过来可以保护您免受意外错误或错误的影响。