繁体   English   中英

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

[英]Is array.push a form of reassignment?

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

因此,鉴于上下文,这是具体情况:

let meta = [a.platform];

就在下面:

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

所以现在短信给了我一个警告: 'meta永远不会被重新分配。 使用const代替'


我明白meta = somethingNew会重新分配变量。 但在这种情况下,这个变量是不是也与它创建时的变量不同?

或者,使其更加清晰

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

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

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方法(返回新字符串),也无法对其进行修改。

 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永远不会被重新分配......变异不是重新分配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM