在TypeScript(或Javascript)中使用const vs let的好处

时间:2017-02-16 13:31:58

标签: javascript typescript resharper

我正在阅读TypeScript Deep Dive,我发现letconst都是块范围的,这很棒。显然,const不能改变(它是不可变的)。但是为什么ReSharper鼓励我尽可能多地将let更改为const?我假设ReSharper认为使用const超过let会有性能提升? constlet之间是否存在速度差异?使用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 idlet value,但ReSharper要求我将它们更改为const,这有效,但为什么在这种情况下更好?或者无论如何?

我还找到了this question on SO,但它更多地讨论了letconst做了什么,而不是为什么一个比另一个好。它确实尽可能地使用const,但它提供了什么好处?

2 个答案:

答案 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,这意味着您已经预先考虑过您不打算重新分配它,这反过来可以保护您免受意外错误或错误的影响。