Javascript 调用require时const vs let

Javascript 调用require时const vs let,javascript,node.js,ecmascript-6,io.js,Javascript,Node.js,Ecmascript 6,Io.js,作为io.js,现在您终于可以使用const和let关键字了。显然,let是var的继承者,只是拥有一些超能力 但是常量呢?当然,我知道“常量”是什么意思,但我想知道什么时候使用它(关于最佳实践) 例如,如果我创建了一个需要另一个模块的模块,我可以写: 'use strict'; const util = require('util'); const foo = function () { // Do something with util }; module.exports = fo

作为io.js,现在您终于可以使用
const
let
关键字了。显然,
let
var
的继承者,只是拥有一些超能力

但是常量呢?当然,我知道“常量”是什么意思,但我想知道什么时候使用它(关于最佳实践)

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

'use strict';

const util = require('util');

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

module.exports = foo;
基本上,我已经用
const
替换了所有出现的
var
。一般来说,我认为这是可以的,但是如果我遵循这个模式,它会让我更多地使用
const
而不是
let
,因为大多数变量不是字面意义上的“变量”


这个款式好吗?我是否应该选择“让”?什么时候我应该选择
const
而不是
let

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

  • 给变量赋值

    "use strict";
    const a = 1;
    a = 2;
    
    将产生
    类型错误:分配给常量变量。

  • 使用变量而不显式初始化

    "use strict";
    const a;
    
    将生成
    SyntaxError:意外标记

  • 简单地说,我会说

    • 只要不想修改某些变量,就使用
      const

    • 如果您希望与常量正好相反,请使用
      let

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


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

    我有与您描述的相同的感觉。在我的代码中,大部分声明的变量都是常量,甚至是对象和数组。您可以声明常量对象和数组,但仍可以修改它们:

    const arr = [];
    arr.push(1);
    arr;
    // [ 1 ]
    
    const obj = {};
    obj.a = 1;
    obj;
    // { a: 1 }
    
    AFAIK在导入时不需要变量声明,我怀疑这一点


    我认为这是个人的选择。当需要模块和模块局部变量时,我总是使用const(
    foo
    )。对于其余的变量,适当地使用const,但千万不要疯狂地到处使用const。我不知道let和const之间的性能,因此我无法判断是否最好尽可能使用const。

    性能测试
    const
    vs
    let
    使用
    require
    for 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。。。。2547746.72 op/s

    测试2。。。。2570044.33 op/s

    背景:

    const util = require('util')
    
    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");
    
    这不得在控制台中打印arr1和arr2相同的
    。尽管他们在各个方面看起来都一样。但是如果我们看到
    arr1
    arr2
    指向内存中的不同位置。同样的概念也适用于对象。例如:

    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
    。这使得代码不易出错,即减少出错的机会<函数中的code>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阶乘=(n)=>{
    让事实=1;
    
    对于(假设i=1;iI期望
    const
    都是大写的,比如
    const KEY_A=65
    。我认为,如果值永远不会更改,或者更重要的是防止更改,则应该使用
    const
    let
    应该在以后覆盖/更改值时使用,并且当您需要一个块范围的变量而不是函数范围的变量时,应该使用th。如果您需要一个函数范围的变量,
    var
    仍然可用。我可能错了,我还没有读过那么多ES6/2015。将
    util
    声明为
    const
    仅仅意味着该变量不能设置为其他变量值。但是,如果它不是原语,您仍然可以添加、修改和删除其中的属性。此外,Const的性能似乎很差,尽管实际上,
    let
    Const
    确实可以提升,但它比这要复杂一点:我认为前半部分不正确lly确实会抛出一个错误。
    const
    let
    都会提升,但都会受到限制,因此在声明之前不能使用它们。@ZachB我同意。为我辩护,
    const
    在邋遢模式下的行为会有所不同。。谢谢你指出,我删除了错误的部分。为什么不疯狂使用它呢