现在,作为io.js supports ES6,您终于可以使用const
和let
个关键字。显然,let
是var
的继承者,只有一些超能力。
但是const
呢?当然,我知道"常数"意思是,但我想知道何时使用它(关于最佳实践)。
例如,如果我创建一个需要另一个模块的模块,我可以写:
'use strict';
const util = require('util');
const foo = function () {
// Do something with util
};
module.exports = foo;
基本上我用var
取代了const
的每一次出现。一般来说,我认为这是可以的,但是如果我遵循这种模式,它会让我更多地使用const
而不是let
,因为大多数变量不是'变量& #34;从字面意义上说。
let
吗?我应该何时选择const
而不是let
?
答案 0 :(得分:39)
const
可以在您不想要程序时正常使用
将任何内容分配给变量
"use strict";
const a = 1;
a = 2;
将生成TypeError: Assignment to constant variable.
。
使用变量而不显式初始化。
"use strict";
const a;
将生成SyntaxError: Unexpected token ;
简单地说,我会说,
只要您想要修改某些变量
const
如果您想与let
完全相反
const
使用var
,如果您想与ES5实现兼容,或者您想要模块/功能级别范围。
仅在需要阻止级别范围时才使用let
,否则使用let
或var
不会有任何区别。
答案 1 :(得分:7)
我有同样的感觉,你在描述。在我的代码中,很大比例的声明变量往往是常量,甚至是对象和数组。您可以声明常量对象和数组,但仍然可以修改它们:
const arr = [];
arr.push(1);
arr;
// [ 1 ]
const obj = {};
obj.a = 1;
obj;
// { a: 1 }
AFAIK ES6 modules在导入时不需要变量声明,我怀疑是io.js will move to ES6 modules in a near future。
我认为这是个人选择。在需要模块和模块局部变量时,我总是使用const(在您的示例中为foo
)。对于其余的变量,适当地使用const,但永远不要生气并在任何地方使用const。我不知道let和const之间的性能,所以我不知道在可能的情况下使用const是否更好。
答案 2 :(得分:2)
针对Node.js 6.10 let
的性能测试require
vs require('do-you-even-bench')([
{ name: 'test 1', fn: function() {
const path = require('path');
}
},
{ name: 'test 2', fn: function() {
let path = require('path');
}
}
]);
用法:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Smoke Test" configfailurepolicy="continue">
<test name="SmokeTest">
<classes>
<class name="name.test1"/>
<class name="name.test2"/>
<class name="name.test3"/>
</classes>
</test>
</suite>
测试1 .... 2,547,746.72 op / s
测试2 .... 2,570,044.33 op / s
答案 3 :(得分:1)
背景:
let 是具有强制限制的var关键字的后继。这些限制使犯错的机会减少了,并且增加了安全性。基本上,它具有块作用域,即它仅可用于声明它的块。换句话说,不能在已声明的块之外访问变量。
const 可访问性也在块范围内。但是一旦初始化就无法重新初始化。对于数组对象,这可能会很棘手
数组初始化是什么意思?
let arr = [1, 2, 3, 4, 5];
arr
包含数组第一个元素的引用(地址或指针)。这就是为什么这种情况永远不会奏效的原因。
let arr1 = [1, 2, 3, 4, 5];
let arr2 = [1, 2, 3, 4, 5];
if (arr1 == arr2)
console.log("Both arr1 and arr2 are same");
这将永远不会在控制台中打印Both arr1 and arr2 are same
。尽管它们在各个方面看起来都是一样的。但是,如果我们看到arr1
和arr2
指向内存中的不同位置。相同的概念也适用于 objects 。例如:
let obj1 = {name:'John', age:'22'}
let obj2 = {name:'John', age:'22'}
if (obj1 == obj2)
console.log("Both obj1 and obj2 are same");
obj1
和obj2
指向不同的存储位置。因此console.log语句将永远不会运行。
如果我们对数组或对象使用const
声明,则根据定义它不能被重新初始化。但是实际上分配给数组或对象的标识符是一个内存指针(地址)。可以相应地修改(变异)数组或对象。
问题的答案:
const util = require('util')
这种类型的声明可确保不会意外地声明util
。这使得代码不易出错,即减少了出错的机会。函数中的const
声明使其不那么容易出错。重新声明时,会引发错误。
例如,假设您声明了一个factorial
函数,该函数负责查找数字的阶乘。让我们考虑这个例子:
const factorial = (n) => {
let fact = 1;
for(let i=1;i<=n;i++)
fact *= i;
return fact;
}
const factorial = 5;
console.log(factorial(10));
此处将引发错误。 const
使标识符 factorial 的使用唯一。即一个需要输入并找到其阶乘的函数。
这有助于减少难以调试的错误。
如果将数组或对象声明为const
,则可以修改(突变)该数组或对象,但是任何其他标识符都不能使用使用const
声明的相同名称。
我希望这会有所帮助。