10

我正在一个包含多个 javascript 文件的项目中工作,我现在正在做的部分工作是迁移现有代码以使用更新的 ES6+ 功能以及确保我们遵守AirBnB Eslint 规则

因此,鉴于这种情况,这是具体情况:

let meta = [a.platform];

就在它的正下方:

meta.push(a.browserName ? a.browserName : 'any');

所以现在 linter 给了我一个警告:'meta 永远不会被重新分配。改用 const'


我知道这meta = somethingNew将重新分配变量。但是在这种情况下,这个变量是不是也不同于它创建时的样子?

或者,为了更清楚

我可以使用const定义将接收新项目的数组吗?如果不是,为什么?

另外,如果不是:为什么 linter 会发出警告?

4

2 回答 2

7

您唯一需要知道的是,const这与不变性无关const只是允许您防止重新分配,这意味着您不能这样做:

   
// OK 
const foo = '';
const bar = [];
const baz = {};

// WTF are we doing!?
foo = 'Foo';
bar = ['Bar'];
baz = {baz: 'Baz'};

然而,在 JavaScript 中,对象值是可变的;与不可变的原始值相反。因此,如果您将字符串放入 a const,您将根本无法修改它,即使使用String.prototype方法(返回新字符串)也是如此。

const str = 'Lorem ipsum';

console.log(str.slice(6)); // This is actually a new string...
console.log(str); // The original string has not been modified!

但是,它与数组或对象字面量完全不同:

const arr = [];
const obj = {};

arr.push('Foo');
arr.push('Bar');

obj.foo = 'Foo';
obj.bar = 'Bar';

console.log(arr); // Modified!
console.log(obj); // Modified!

在这一点上,应该很清楚:linter 显示了这个警告,因为事实上,meta 永远不会被重新分配......突变不是重新分配。

于 2017-08-09T17:22:42.813 回答
5

meta.push()不会重新分配变量,它只是修改变量引用的数组——它仍然是同一个数组,但内容不同。所以你可以使用const变量声明,因为你永远不会让它引用不同的数组。

如果您分配给数组元素,情况也是如此。还行吧:

const meta = [a.platform];
meta[1] = somethingNew;

第二个赋值没有改变meta,它改变了数组。

于 2017-08-09T16:25:34.293 回答