array.push 是一种重新分配的形式吗?

Is array.push a form of reassignment?

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

所以,鉴于这种情况,这是具体情况:

let meta = [a.platform];

在其正下方:

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

所以现在 linter 给我一个警告:'meta is never reassigned. Use const instead'.


我知道 meta = somethingNew 会重新分配变量。但是这样的话,这个变量是不是也和当初创建的时候不一样了呢?

或者,为了更清楚

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

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

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

给数组元素赋值也是一样。这没关系:

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

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

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

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

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

但是,在 JavaScript 中,对象值是可变的;与不可变的原始值相反。所以如果你把一个字符串放在 const 中,你将根本无法修改它,即使使用 String.prototype 方法(return 新字符串)也是如此。

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 显示此警告是因为,实际上,元数据永远不会重新分配...突变不是重新分配。