[英]const vs let when calling require
由於 io.js 現在支持 ES6 ,您終於可以使用const
和let
關鍵字了。 很明顯, let
是var
的繼承者,只是多了一些超能力。
但是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
給變量賦值
"use strict"; const a = 1; a = 2;
將產生TypeError: Assignment to constant variable.
.
使用變量而不顯式初始化。
"use strict"; const a;
將產生SyntaxError: Unexpected token ;
簡單地說,我想說,
每當您不希望修改某些變量時,請使用const
如果您想要與const
完全相反的內容,請使用let
使用var
,如果你想與 ES5 實現兼容,或者如果你想要模塊/函數級別的范圍。
僅當您需要塊級作用域時才使用let
,否則使用let
或var
不會有任何區別。
我和你描述的感覺一樣。 我的代碼中很大一部分聲明的變量往往是常量,甚至是對象和數組。 您可以聲明常量對象和數組,並且仍然可以修改它們:
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
上的性能測試const
與let
用法:
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
的。 盡管它們在各個方面看起來都一樣。 但是如果我們看到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
。 這使得代碼不易出錯,即減少出錯的機會。 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 是一個好習慣。
所以我的偏好:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.