const vs let在调用require时

时间:2015-01-25 10:44:12

标签: javascript node.js ecmascript-6 io.js

现在,作为io.js supports ES6,您终于可以使用constlet个关键字。显然,letvar的继承者,只有一些超能力。

但是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

4 个答案:

答案 0 :(得分:39)

const可以在您不想要程序时正常使用

  1. 将任何内容分配给变量

    "use strict";
    const a = 1;
    a = 2;
    

    将生成TypeError: Assignment to constant variable.

  2. 使用变量而不显式初始化。

    "use strict";
    const a;
    

    将生成SyntaxError: Unexpected token ;

  3. 简单地说,我会说,

    • 只要您想要修改某些变量

    • ,请使用const
    • 如果您想与let完全相反

    • ,请使用const
    • 使用var,如果您想与ES5实现兼容,或者您​​想要模块/功能级别范围。

    仅在需要阻止级别范围时才使用let,否则使用letvar不会有任何区别。

答案 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。尽管它们在各个方面看起来都是一样的。但是,如果我们看到arr1arr2指向内存中的不同位置。相同的概念也适用于 objects 。例如:

let obj1 = {name:'John', age:'22'}
let obj2 = {name:'John', age:'22'}

if (obj1 == obj2)
     console.log("Both obj1 and obj2 are same");

obj1obj2指向不同的存储位置。因此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声明的相同名称。

我希望这会有所帮助。