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

Tar*_*yen 17 javascript resharper typescript

我读了打字稿深入了解,我看到这两个letconst是块作用域,这是伟大的.显然,const不能改变(它是不可变的).但为什么ReSharper鼓励我改变尽可能多的lets 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;
}
Run Code Online (Sandbox Code Playgroud)

以前,我有let id,let value但ReSharper要求我改变它们const,这有效,但为什么在这种情况下更好?或者无论如何?

我也在SO上发现了这个问题,但它更多地讨论了什么letconst做什么,而不是为什么一个比另一个好.它确实说const尽可能多地使用,但它提供了什么好处?

Lou*_*uis 24

我同意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;
}
Run Code Online (Sandbox Code Playgroud)

在这段代码中,我输入tree = child时打算输入found = child.是的,可以在测试中找到错误.但为什么要等待测试?我从来没有打算tree改变.如果我标记了它,const那么我会立即学习错误,因为编译器会告诉我它.我不必等待测试.上面的代码相当简单,但想象一下使用更多变量的更复杂的算法.


gio*_*gim 9

IMO我认为这与性能原因无关,但它可能与文档有关.

如果您有一个可以声明为的变量const,并且您声明它,则告知读者您不打算稍后将其重新分配给其他值.

它也可能与最小特权原则有关,当你声明一个变量时const,你可以保护自己免受以后的事故修改.