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

Jon*_*fer 5 javascript memory-management lint ecmascript-6 eslint-config-airbnb

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

因此,在这种情况下,这是特定的情况:

let meta = [a.platform];
Run Code Online (Sandbox Code Playgroud)

在其下方:

meta.push(a.browserName ? a.browserName : 'any');
Run Code Online (Sandbox Code Playgroud)

因此,现在,短毛猫给了我一个警告:“永不重新分配元数据。使用const代替”


我知道那meta = somethingNew将是重新分配变量。但是在这种情况下,此变量与创建时的变量是否也有所不同?

或者,使其更加清晰

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

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

Bad*_*bra 7

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

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

// WTF are we doing!?
foo = 'Foo';
bar = ['Bar'];
baz = {baz: 'Baz'};
Run Code Online (Sandbox Code Playgroud)

然而,在 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!
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

console.log(arr); // Modified!
console.log(obj); // Modified!
Run Code Online (Sandbox Code Playgroud)

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


Bar*_*mar 5

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

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

const meta = [a.platform];
meta[1] = somethingNew;
Run Code Online (Sandbox Code Playgroud)

第二个分配没有改变meta,它改变了数组。