我最近在JavaScript中遇到了const关键字。据我所知,它是用来创建不可变变量的,我已经测试了,以确保它不能被重新定义(在Node.js中):

const x = 'const';
const x = 'not-const';

// Will give an error: 'constant 'x' has already been defined'

我意识到它还没有在所有浏览器上标准化——但我只对Node.js V8的环境感兴趣,我注意到某些开发人员/项目似乎非常喜欢它,当var关键字可以用于同样的效果时。

什么时候用const代替var比较合适? 它是否应该被用在每一个不存在的变量上 重新分配是声明的? 如果用var来代替,会有什么不同吗 Const还是反之?


当前回答

var和let的语义

Var和let是对机器和其他程序员的声明:

我希望这个赋值在执行过程中发生变化。不要依赖于这个赋值的最终值。

使用var和let的含义

Var,并强制其他程序员读取从声明到最终使用的所有中间代码,并在程序执行时推断赋值的值。

它们削弱了ESLint和其他语言服务的机器推理,从而在以后的赋值中正确检测输入错误的变量名,并在内部作用域忘记声明的情况下对外部作用域变量名进行作用域重用。

它们还导致运行时在所有代码路径上运行多次迭代,以检测它们实际上是常量,然后才能优化它们。尽管这比错误检测和开发人员可理解性的问题要小。

何时使用const

如果引用的值在执行过程中没有改变,那么表达程序员意图的正确语法是const。对于对象,改变引用的值意味着指向另一个对象,因为引用是不可变的,而对象不是。

“常量”对象

对于对象引用,指针不能更改为另一个对象,但创建并赋值给const声明的对象是可变的。可以从const引用的数组中添加或删除项,也可以更改const引用对象的属性键。

为了实现不可变对象(同样,这使你的代码更容易为人类和机器推理),你可以object .freeze对象在声明/赋值/创建,像这样:

const Options = Object.freeze(['YES', 'NO'])

freeze确实对性能有影响,但您的代码可能因为其他原因而变慢。你想要侧写它。

你也可以将可变对象封装在状态机中,并返回深度副本作为值(这就是Redux和React状态的工作方式)。有关如何从第一原则构建全局状态的示例,请参见避免在Browser JS中使用可变全局状态。

当var和let是一个很好的匹配

Let和var表示可变状态。在我看来,它们应该只用于建模实际的可变状态。比如“连接是否存在?”

这些最好封装在可测试的状态机中,这些状态机公开了表示“连接的当前状态”(在任何时间点都是常数)的常量值,以及代码的其余部分真正感兴趣的内容。

加上合成副作用和转换数据,编程已经够难了。通过创建带有变量的可变状态将每个函数变成不可测试的状态机只会增加复杂性。

要了解更细致的解释,请参见Shun the Mutant - const的案例。

其他回答

简介:

Const创建一个不可变绑定,这意味着Const变量标识符是不可重赋的。

const a = "value1";

你不能用

a = "value2";

然而,如果const标识符包含一个对象或数组,只要不重新赋值,它的值就可以更改。

const x = { a: 1 }

x.a = 2; // Is possible and allowed

const numbers = [1, 2];
numbers.push(3); // Is possible and allowed

请注意,const是块作用域,就像let一样,它与var不同(var是函数作用域)。

简而言之,当某些东西不太可能通过重赋来改变时,使用const,否则使用let或var,这取决于你想要的作用域。

当可以通过重赋改变什么,不能通过重赋改变什么的时候,对代码进行推理就容易得多了。将const对象更改为let对象非常简单。在默认情况下使用const会让您三思而后行。在很多情况下,这是一件好事。

你回答得很好,但还是简单点吧。

当你有一个定义的常量时,应该使用Const(理解为:它在程序执行期间不会改变)。

例如:

const pi = 3.1415926535

如果你认为这是在以后的执行中可能会改变的东西,那么就使用var。

根据这个例子,实际的区别是,使用const时,你总是假设pi将是3.14[…],这是事实。

如果你把它定义为一个变量,它可能是3.14[…]或者不是。

从更专业的角度来说,Tibos的理论在学术上是正确的。

根据我的经验,当我想要设置一些我以后可能想要更改的东西时,我使用const,而不必在代码中寻找已经硬编码的位,例如文件路径或服务器名称。

测试中的错误是另一回事。你试图创建另一个名为x的变量,这将是一个更准确的测试:

const x = 'const';
x = 'not-const';

'const'指示您的代码标识符将不会被重新分配。

这是一篇关于何时使用“const”,“let”或“var”的好文章:JavaScript ES6+: var, let,或const?

重点在于如何决定在开发过程中应该使用哪一个标识符。

在JavaScript中有三个标识符。

var(可以重新声明和重新初始化) const(不能重新声明和重新初始化,可以使用push更新数组值) Let(可以重新初始化,但不能重新声明)

'var':在编码时,当我们谈论代码标准时,我们通常使用易于其他用户和开发人员理解的标识符的名称。

例如,如果我们正在考虑使用一些输入并处理它并返回一些结果的许多函数,例如:

变量使用的例子

function firstFunction(input1, input2)
{
    var process = input1 + 2;
    var result = process - input2;
    return result;
}


function otherFunction(input1, input2)
{
    var process = input1 + 8;
    var result = process * input2;
    return result;
}

在上面的例子中,两个函数产生不同的-2结果,但使用相同的变量名。在这里,我们可以看到“过程”和“结果”都被用作变量,它们应该是。

常数与变量的例子

const tax = 10;
const pi = 3.1415926535;

function firstFunction(input1, input2)
{
    var process = input1 + 2;
    var result = process - input2;
    result = (result * tax)/100;
    return result;
}


function otherFunction(input1, input2)
{
    var process = input1 + 8;
    var result = process * input2 * pi;
    return result;
}

在JavaScript中使用“let”之前,我们必须在JavaScript文件顶部添加“use strict”

常量和变量的let示例

const tax = 10;
const pi = 3.1415926535;
let trackExecution = '';

function firstFunction(input1, input2)
{
    trackExecution += 'On firstFunction';
    var process = input1 + 2;
    var result = process - input2;
    result = (result * tax)/100;
    return result;
}


function otherFunction(input1, input2)
{
    trackExecution += 'On otherFunction'; # Can add current time
    var process = input1 + 8;
    var result = process * input2 * pi;
    return result;
}

firstFunction();
otherFunction();
console.log(trackExecution);

在上面的例子中,您可以跟踪哪个函数在特定操作期间执行&哪个函数没有使用。