调用 require 时 const vs let

const vs let when calling require

作为 io.js 现在 supports ES6 您终于可以使用 constlet 关键字了。很明显,letvar的继承者,只是多了一些超能力而已。

但是 const 呢?我当然知道 "constant" 是什么意思,但我想知道什么时候使用它(关于最佳实践)。

例如,如果我创建一个需要另一个模块的模块,我可以写:

'use strict';

const util = require('util');

const foo = function () {
  // Do something with util
};

module.exports = foo;

基本上我已经用 const 替换了每个出现的 var。一般来说,我认为这没问题,但如果我遵循这种模式,它会让我使用 const 而不是 let,因为大多数变量不是 "variables"字面意思。

这种风格好看吗?我应该选择 let 吗?我什么时候应该选择 const 而不是 let

const不需要程序的时候可以正常使用

  1. 给变量赋值

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

    会产生TypeError: Assignment to constant variable..

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

    "use strict";
    const a;
    

    会产生SyntaxError: Unexpected token ;

简单地说,我会说,

  • 每当你不想修改某些变量时使用const

  • 如果您想要 const

  • 的完全相反,请使用 let
  • 使用var,如果你想兼容ES5实现或者你想要module/function级范围。

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

我和你描述的感觉一样。在我的代码中,很大一部分声明的变量往往是常量,甚至是对象和数组。您可以声明常量对象和数组,并且仍然能够修改它们:

const arr = [];
arr.push(1);
arr;
// [ 1 ]

const obj = {};
obj.a = 1;
obj;
// { a: 1 }

据我所知ES6 modules do not require variable declarations when importing, and I suspect that io.js will move to ES6 modules in a near future.

我认为这是个人选择。在需要模块和模块局部变量(在您的示例中为 foo )时,我总是使用 const 。对于其余的变量,适当使用const,但不要发疯,到处使用const。我不知道 let 和 const 之间的性能,所以我不知道是否尽可能使用 const 更好。

性能测试 constletrequire 上的使用 Node.js 6.10:

require('do-you-even-bench')([
  { name: 'test 1', fn: function() { 
    const path = require('path');
    } 
  },
  { name: 'test 2', fn: function() { 
    let path = require('path');
    } 
  }
]);

测试 1 .... 2,547,746.72 op/s
测试 2 .... 2,570,044.33 op/s

背景:

let 是带有强制限制的 var 关键字的继承者。这些限制使犯错误的机会更少,安全性更高。基本上,它具有块范围,即它仅适用于声明它的块。换句话说,不能在声明的块之外访问变量。

const 可访问性也在块范围内。但是一旦初始化就不能重新初始化。这在 Array, Objects

的情况下可能很棘手

数组初始化是什么意思?

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 声明的名称相同的名称。

希望对您有所帮助。

const:范围:块。重新分配:不允许。声明+初始化:必须

let:范围:块。 reassign:allow。声明+初始化:可选

var:范围:全局和功能。重新分配:允许。声明+初始化:可选。

根据w3schools use always use const is a good practice.

所以我的偏好:

  1. const
  2. 变量