array.push 是一种重新分配的形式吗?
Is array.push a form of reassignment?
我在一个有几个 javascript 文件的项目中工作,我现在正在做的部分工作是迁移现有代码以使用更新的 ES6+ 功能,并确保我们遵守AirBnB Eslint Rules.
所以,鉴于这种情况,这是具体情况:
let meta = [a.platform];
在其正下方:
meta.push(a.browserName ? a.browserName : 'any');
所以现在 linter 给我一个警告:'meta is never reassigned. Use const instead'.
我知道 meta = somethingNew
会重新分配变量。但是这样的话,这个变量是不是也和当初创建的时候不一样了呢?
或者,为了更清楚
我可以使用 const 来定义将接收新项目的数组吗?如果不是,为什么?
此外,如果不是:为什么 linter 会发出警告?
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
方法(return 新字符串)也是如此。
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 显示此警告是因为,实际上,元数据永远不会重新分配...突变不是重新分配。
我在一个有几个 javascript 文件的项目中工作,我现在正在做的部分工作是迁移现有代码以使用更新的 ES6+ 功能,并确保我们遵守AirBnB Eslint Rules.
所以,鉴于这种情况,这是具体情况:
let meta = [a.platform];
在其正下方:
meta.push(a.browserName ? a.browserName : 'any');
所以现在 linter 给我一个警告:'meta is never reassigned. Use const instead'.
我知道 meta = somethingNew
会重新分配变量。但是这样的话,这个变量是不是也和当初创建的时候不一样了呢?
或者,为了更清楚
我可以使用 const 来定义将接收新项目的数组吗?如果不是,为什么?
此外,如果不是:为什么 linter 会发出警告?
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
方法(return 新字符串)也是如此。
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 显示此警告是因为,实际上,元数据永远不会重新分配...突变不是重新分配。