簡體   English   中英

調用 require 時 const vs let

[英]const vs let when calling require

由於 io.js 現在支持 ES6 ,您終於可以使用constlet關鍵字了。 很明顯, letvar的繼承者,只是多了一些超能力。

但是const呢? 我當然知道“常量”是什么意思,但我想知道什么時候使用它(關於最佳實踐)。

例如,如果我創建一個需要另一個模塊的模塊,我可以這樣寫:

'use strict';

const util = require('util');

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

module.exports = foo;

基本上我已經用const替換了每次出現的var 一般來說,我認為這沒問題,但如果我遵循這種模式,我會比let有更多的const用途,因為大多數變量不是字面意義上的“變量”。

這種風格好嗎? 我應該換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 實現兼容,或者如果你想要模塊/函數級別的范圍。

僅當您需要塊級作用域時才使用let ,否則使用letvar不會有任何區別。

我和你描述的感覺一樣。 我的代碼中很大一部分聲明的變量往往是常量,甚至是對象和數組。 您可以聲明常量對象和數組,並且仍然可以修改它們:

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

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

AFAIK ES6 模塊在導入時不需要變量聲明,我懷疑io.js 將在不久的將來轉移到 ES6 模塊

我認為這是個人選擇。 在需要模塊和模塊局部變量(在您的示例中為foo )時,我總是使用 const 。 對於其余的變量,適當地使用 const,但永遠不要發瘋並在任何地方使用 const。 我不知道 let 和 const 之間的性能,所以我不知道盡可能使用 const 是否更好。

Node.js 6.10 在require上的性能測試constlet用法:

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可訪問性也在塊范圍內。 但是一旦初始化就不能重新初始化。 這在數組、對象的情況下可能很棘手

數組初始化是什么意思?

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在控制台中Both arr1 and arr2 are same的。 盡管它們在各個方面看起來都一樣。 但是如果我們看到arr1arr2指向內存中的不同位置。 同樣的概念也適用於對象 例如:

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聲明的名稱相同的名稱。

我希望這有幫助。

常量:scope:塊。 重新分配:不允許。 聲明+初始化:必須

:scope:塊。 重新分配:允許。 聲明+初始化:可選

var :scope:全局和功能。 重新分配:允許。 聲明+初始化:可選。

根據w3schools的說法,總是使用 const 是一個好習慣。

https://www.w3schools.com/js/js_const.asp

所以我的偏好:

  1. 常數
  2. 變量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM