我正在一个包含多个javascript文件的项目中工作,我现在正在做的部分工作是迁移现有代码以使用更新的ES6 +功能以及确保我们遵守AirBnB Eslint Rules。
因此,鉴于上下文,这是具体情况:
let meta = [a.platform];
就在下面:
meta.push(a.browserName ? a.browserName : 'any');
所以现在linter给了我一个警告:' meta永远不会被重新分配。请改用const而不是。
我知道meta = somethingNew
会重新分配变量。但是在这种情况下,这个变量是不是也与它创建时的变量有所不同?
或者,为了使其更加清晰
我可以使用 const 来定义将接收新项目的数组吗?如果没有,为什么?
另外,如果不是:为什么短信会发出警告?
答案 0 :(得分:4)
meta.push()
不会重新分配变量,它只是修改变量引用的数组 - 它仍然是相同的数组,但具有不同的内容。所以你可以使用const
作为变量声明,因为你永远不会让它引用不同的数组。
如果指定给数组元素,情况也是如此。这没关系:
const meta = [a.platform];
meta[1] = somethingNew;
第二项任务不会更改meta
,它会更改数组。
答案 1 :(得分:2)
您唯一需要知道的是 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永远不会被重新分配......突变不是重新分配。