TypeScript(或JavaScript)中使用const和let的好处

37

我正在阅读TypeScript深入浅出,我发现letconst都是块级作用域,这很棒。显然,一个const是不可更改的(它是不可变的)。但为什么ReSharper鼓励我尽可能将许多let更改为const呢?我假设ReSharper认为在使用const时会有性能提升,这是正确的吗?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。这样做有什么好处,在这种情况下或者别的情况下呢?

我在SO上找到了这个问题,但是它更多地讨论了 letconst 的作用,而不是为什么一个比另一个更好。它确实说尽可能使用 const,但是这样做有什么好处呢?


2
由于在这方面,我认为TS和JS之间没有区别,因此我也会添加JS标签。 - Giorgi Moniava
2个回答

56

我同意Giorgi的观点,即性能不是主要原因。代码分析器同样可以确定使用let声明的变量永远不会被重新分配,并进行优化,就像你使用const声明变量一样。(事实上,代码检查工具也有规则来检测这一点,并建议使用const代替let。)

是的,它确实向读者传达了您不会对变量进行赋值的信息。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;
}
在这段代码中,我本意是要输入found = child,但我却输入了tree = child。是的,这个错误可以在测试中发现。但为什么要等到测试呢?我本来不想改变tree的。如果我把它标记为const,编译器会立即告诉我这个错误,我也就无须等待测试了。上面的代码相当简单,但想象一下使用更多变量的更复杂算法。

加1作为示例 :-) - whoami - fakeFaceTrueSoul
感谢您提供全面的答案。需要注意的是,const与let在“hello world”级别上可能存在问题,在大范围内则毫无意义。如果您在提交代码之前运行它,您将会注意到可能存在的错误。当另一个开发人员可以访问源代码时,他/她可以更改定义,并完全忽略任何微不足道的不可变性等级。这种情况经常发生。 - JHM

16

当你有一个可以声明为const的变量时,如果你将其声明为这样,就意味着你告诉读者你不打算在以后重新分配它的值。

同时,通过声明一个变量为const,意味着你已经事先考虑好了不会重新分配它,从而可以保护你免受意外的错误或漏洞。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接