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

15

我正在参与一个项目,其中包含多个JavaScript文件,目前我正在做的部分工作是将现有代码迁移到使用更新的ES6+特性,并确保我们遵守AirBnB Eslint规则

因此,在这种情况下,这是具体的情况:

let meta = [a.platform];

紧接着就是:

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

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


我明白 meta = somethingNew 会重新赋值变量。但在这种情况下,这个变量难道不是与创建时不同的吗?

或者,为了更清楚

我能用 const 定义一个会接收新项的数组吗?如果不能,为什么?

还有,如果不能:为什么 linter 会发出警告?


Object 类型(如 Array)的重新赋值只是将一个名称与另一个引用(指向另一个 Object 类型)重新绑定。当您像在示例中那样改变 Object 类型时,您仅仅是改变了它的属性,而不是底层引用。 - user6445533
“但在这种情况下,这个变量不是与创建时不同了吗?” “不是的。该变量仍具有相同的数组值。数组在此期间已被改变,但这并不使其成为不同的值。” - Felix Kling
2个回答

11

你需要知道的唯一一件事是const和不可变性没有任何关系const只是允许你阻止重新赋值,这意味着你不能这样做:

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

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

然而,在JavaScript中,对象值是可变的;与不可变的基本值相反。因此,如果您将字符串放入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!

目前为止,应该清楚:代码检查器发出这个警告是因为meta确实从未被重新赋值...变异不等于重新赋值。


6

meta.push()并不会重新分配变量,它只是修改了变量所引用的数组 -- 它仍然是同一个数组,但内容不同。因此,您可以使用const进行变量声明,因为您永远不会使其引用其他数组。

如果您对数组元素进行赋值也是如此。下面这样做是可以的:

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

第二个任务不会更改 meta,它会更改数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接