对象或数组的首选声明约定是什么:const 还是 let?

red*_*r13 11 javascript standards tslint

我不是在问什么是技术上可能的;我知道你可以

const a = [];
const b = {};
a.push['sup'];
b.test = 'earth';
Run Code Online (Sandbox Code Playgroud)

我想知道的是letconst当涉及到要修改其内部结构的数组和对象时,是否有任何优先考虑的约定。如果您看到一个用 声明的对象const,您是否认为该对象的意图是使该对象不可变,并且您更愿意看到它let,或者,由于某些 linter(如 tslint)对此有问题,最好只是声明const并相信其他阅读代码的人都知道这并不意味着它是不可变的?

Len*_*des 23

const对象前面的关键字暗示存在一个对象,并且您正在使用引用来更改它。它还(正确地)暗示您不应尝试重新分配对此对象的引用。

const obj = {a: 'foo', b: 'bar'};

const obj2 = {z: 'baz'};

obj = obj2; // const will prevent this operation. 
Run Code Online (Sandbox Code Playgroud)

const并不意味着不应更改对象属性。这确实意味着您不应该尝试更改引用。

如果您打算重新分配对对象的引用,则使用let.

来源:AirBnB Javascript 风格指南

  • 谢谢。我会说,如果它对 Airbnb 来说足够好,那对我来说就足够了。 (2认同)

JS-*_*nan 10

没有首选的,它基于您对该数组或对象的使用选择。你必须清楚地理解突变和重新分配。

突变 - 更新内存中存在的值

重新分配 - 变量指向存储新值的新内存位置

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
Run Code Online (Sandbox Code Playgroud)