[英]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.