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定义将接收新项目的数组吗?如果没有,为什么?
另外,如果不是:为什么棉短绒会发出警告?
您唯一需要知道的是,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 永远不会被重新分配......突变不是重新分配。
meta.push()不重新分配变量,它只是修改变量引用的数组——它仍然是同一个数组,但内容不同。所以你可以使用const变量声明,因为你从来没有让它引用不同的数组。
如果分配给数组元素也是如此。还行吧:
const meta = [a.platform];
meta[1] = somethingNew;
Run Code Online (Sandbox Code Playgroud)
第二个分配没有改变meta,它改变了数组。