我不是在问技术上可行的;我知道你可以做到
const a = [];
const b = {};
a.push['sup'];
b.test = 'earth';
我想知道的是,当涉及到将修改其内部的数组和对象时,是否存在优先let
优于const
的约定。如果你看到一个用const
声明的对象,你是否认为对象是不可变的,你是否更愿意看到let
,或者,因为一些短路(如tslint)有问题是,用const
声明它是否更好,并相信阅读代码的其他人都知道这并不意味着它是不可变的?
答案 0 :(得分:4)
对象前面的const
关键字意味着有一个对象,并且您正在使用 引用 来更改它。它(正确地)暗示您不应该尝试重新分配对该对象的引用。
const obj = {a: 'foo', b: 'bar'};
const obj2 = {z: 'baz'};
obj = obj2; // const will prevent this operation.
const
并不意味着不应更改对象属性。这确实意味着您不应该尝试更改参考。
如果您计划重新分配对象的引用,则使用let
。
答案 1 :(得分:1)
没有首选,它基于您对该数组或对象的使用选择。你必须清楚地理解变异和重新分配。
<块引用>变异 - 更新内存中存在的值
重新分配 - 清除旧值并将新值放入内存
Let - 提供变异和重新分配
Const - 提供变异但不重新分配
两者 - 不提供重新申报
如果你的用例只需要改变,你可以选择 const.. 如果你需要重新分配,那么选择 let。
// LET
let condiments = ['Ketchup', 'Soy Sauce', 'Sriracha'];
// Mutation possible
condiments[0] = 'Mayo';
console.log(condiments);//=> [ 'Mayo', 'Soy Sauce', 'Sriracha' ]
// Re-assigning possible
condiments = ['Mayo'];
console.log(condiments); //=> [ 'Mayo' ]
// Re-declaring not possible
//let condiments = [] //=> SyntaxError: Identifier 'condiments' has already been declared
// CONST
const utensils = ['Fork', 'Chopsticks', 'Spork'];
// Mutation Possible
utensils[2] = 'Spoon'
console.log(utensils); //=> [ 'Fork', 'Chopsticks', 'Spoon' ]
utensils.length = 0
console.log(utensils); //=> [ ]
// Re-assigning not possible
//utensils = ['Spoon']; //=> TypeError: Assignment to constant variable.
// Re-declaring not possible
//const utensils = {} //=> SyntaxError: Identifier 'condiments' has already been declared