JavaScript中的常量:什么时候使用它,有必要吗?

我最近遇到过constJavaScript中关键字。据我所知,它用于创建不可变变量,并且已经过测试以确保它不能被重新定义(在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反之亦然吗?
Tony阳光2020/03/18 16:46:06

阅读以下文章。它很好地说明了这一点。 let vs var vs const

小胖阿飞2020/03/18 16:46:06

我不是JS编译行业的专家,但是可以说,v8是在const标志中使用的

通常,在声明并更改了一堆变量之后,内存会碎片化,并且v8停止执行,暂停几秒钟,以进行gc或垃圾回收。

如果使用const v8声明了变量,则可以放心将其放在其他const变量之间的固定大小固定容器中,因为它永远不会改变。由于类型不会更改,因此它还可以保存该数据类型的正确操作。

Eva阿飞2020/03/18 16:46:06

首先,三点有用的事情const(除了与之共享的范围改进之外let):

  • 它为以后阅读代码的人们提供了证明,该值不得更改。
  • 它可以防止您(或任何追随您的人)更改值,除非他们回去有意更改声明。
  • 可以为JavaScript引擎节省一些优化方面的分析。例如,您已经声明值不能更改,因此引擎不必做任何工作来确定值是否更改,因此引擎可以根据未更改的值来决定是否进行优化。

你的问题:

什么时候可以const代替var

可以做任何你声明一个变量,其值永远不会改变的时间。您是否认为合适完全取决于您的偏好/团队的偏好。

是否应该在每次声明一个不会被重新分配的变量时使用它?

这取决于您/您的团队。

如果var is used in place ofconst`或反之则实际上有什么区别吗?

是:

  • varconst具有不同的范围规则。(您可能想与let而不是进行比较var。)特别是:const并且let它们是块范围的,并且在全局范围内使用时,不要在全局对象上创建属性(即使它们确实创建了全局变量)。var具有全局范围(在全局范围内使用时)或函数范围(即使在块中使用),并且在全局范围内使用时,会在全局对象上创建属性。
  • 参见上面的“三件事”,它们都适用于此问题。
神无达蒙2020/03/18 16:46:06

它提供:1)常量引用,例如const x = []-可以修改数组,但是x不能指向另一个数组;和2)区块范围。const和let将一起在ecma6 / 2015中替换var请参见https://strongloop.com/strongblog/es6-variable-declarations/中的讨论

飞云老丝2020/03/18 16:46:06

摘要:

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(它是函数作用域)不同

简而言之,当某些事情不太可能通过重新分配改变时,请使用const,否则根据您希望的范围使用letvar

当代码死了很明显时,通过重新分配可以更改哪些内容以及不能更改哪些内容,就可以更容易地对代码进行推理。将const更改为let非常简单。默认情况下使用const会使您在进行此操作之前三思而后行。在许多情况下,这是一件好事。

Itachi猿2020/03/18 16:46:05

确实是个人喜好。如您所说,可以在不重新分配常量且常量的情况下使用const。例如,如果您想分配生日。您的生日永远不会改变,因此您可以将其用作常量。但是您的年龄确实发生了变化,因此可能会有所不同。

神乐十三2020/03/18 16:46:05

var:声明一个变量,值初始化为可选。

let:声明一个具有块范围的局部变量。

const:声明一个只读的命名常量。

例如:

var a;
a = 1;
a = 2;//re-initialize possible
var a = 3;//re-declare
console.log(a);//3

let b;
b = 5;
b = 6;//re-initiliaze possible
// let b = 7; //re-declare not possible
console.log(b);

// const c;
// c = 9;   //initialization and declaration at same place
const c = 9;
// const c = 9;// re-declare and initialization is not possible
console.log(c);//9
// NOTE: Constants can be declared with uppercase or lowercase, but a common
// convention is to use all-uppercase letters.
Davaid乐宝儿2020/03/18 16:46:05

您有很好的答案,但让我们保持简单。

const 当您有一个已定义的常量时应使用(读为:在程序执行期间它不会更改)。

例如:

const pi = 3.1415926535

如果您认为在以后执行时可能会更改某些内容,请使用var

根据示例,实际的区别在于,const您将始终假设pi为3.14 [...],这是事实。

如果将其定义为var,则可能不是3.14 [...]。

对于更多的技术答案,@ Tibos在学术上是正确的。

TomDavaid2020/03/18 16:46:05

const不是一成不变的。

MDN

const声明创建对值的只读引用。这并不意味着它拥有的值是不可变的,只是不能重新分配变量标识符。

斯丁JinJinHarry2020/03/18 16:46:05

您的问题有两个方面:const代替使用的技术方面是var什么以及与人为因素相关的方面是什么。

技术差异很大。在编译语言中,常量将在编译时被替换,并且其使用将允许其他优化(如删除无效代码)以进一步提高代码的运行效率。最近的(松散使用的术语)JavaScript引擎实际上会编译JS代码以获得更好的性能,因此使用const关键字将告知它们上述优化是可能的,应该完成。这导致更好的性能。

与人有关的方面与关键字的语义有关。变量是一种数据结构,其中包含预期会更改的信息。常数是一种数据结构,其中包含永远不变的信息。如果有错误的余地,var应始终使用。但是,并非必须使用声明所有在程序生存期内从未改变的信息const如果在不同的情况下信息应该更改,var即使实际的更改未出现在您的代码中,也请使用该信息进行指示。