调用 require 时 const vs let
const vs let when calling require
作为 io.js 现在 supports ES6 您终于可以使用 const
和 let
关键字了。很明显,let
是var
的继承者,只是多了一些超能力而已。
但是 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
不需要程序的时候可以正常使用
给变量赋值
"use strict";
const a = 1;
a = 2;
会产生TypeError: Assignment to constant variable.
.
使用变量而不显式初始化。
"use strict";
const a;
会产生SyntaxError: Unexpected token ;
简单地说,我会说,
每当你不想修改某些变量时使用const
如果您想要 const
的完全相反,请使用 let
使用var
,如果你想兼容ES5实现或者你想要module/function级范围。
只有在需要块级范围时才使用let
,否则使用let
或var
不会有任何区别。
我和你描述的感觉一样。在我的代码中,很大一部分声明的变量往往是常量,甚至是对象和数组。您可以声明常量对象和数组,并且仍然能够修改它们:
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 更好。
性能测试 const
与 let
在 require
上的使用 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
。尽管他们在各个方面看起来都一样。但是如果我们看到 arr1
和 arr2
指向内存中的不同位置。同样的概念也适用于 objects。例如:
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
声明的名称相同的名称。
希望对您有所帮助。
const:范围:块。重新分配:不允许。声明+初始化:必须
let:范围:块。 reassign:allow。声明+初始化:可选
var:范围:全局和功能。重新分配:允许。声明+初始化:可选。
根据w3schools use always use const is a good practice.
所以我的偏好:
- const
- 让
- 变量
作为 io.js 现在 supports ES6 您终于可以使用 const
和 let
关键字了。很明显,let
是var
的继承者,只是多了一些超能力而已。
但是 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
不需要程序的时候可以正常使用
给变量赋值
"use strict"; const a = 1; a = 2;
会产生
TypeError: Assignment to constant variable.
.使用变量而不显式初始化。
"use strict"; const a;
会产生
SyntaxError: Unexpected token ;
简单地说,我会说,
每当你不想修改某些变量时使用
const
如果您想要
const
的完全相反,请使用 使用
var
,如果你想兼容ES5实现或者你想要module/function级范围。
let
只有在需要块级范围时才使用let
,否则使用let
或var
不会有任何区别。
我和你描述的感觉一样。在我的代码中,很大一部分声明的变量往往是常量,甚至是对象和数组。您可以声明常量对象和数组,并且仍然能够修改它们:
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 更好。
性能测试 const
与 let
在 require
上的使用 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
。尽管他们在各个方面看起来都一样。但是如果我们看到 arr1
和 arr2
指向内存中的不同位置。同样的概念也适用于 objects。例如:
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
声明的名称相同的名称。
希望对您有所帮助。
const:范围:块。重新分配:不允许。声明+初始化:必须
let:范围:块。 reassign:allow。声明+初始化:可选
var:范围:全局和功能。重新分配:允许。声明+初始化:可选。
根据w3schools use always use const is a good practice.
所以我的偏好:
- const
- 让
- 变量