【发布时间】:2016-10-21 18:17:50
【问题描述】:
如果我有一个对象数组,并循环遍历它们,为每个对象分配一个属性值,WebStorm 会警告我:
分配给原语的值将丢失
但是,在控制台中进行测试时,我不会“丢失”任何值。
这只发生在循环位于函数内部时。
下面是这个错误的一个例子:
let people = [
{
name: 'Foo',
age: 21,
surname: 'FooBar'
},
{
name: 'Bar',
age: 51,
surname: 'FooBar'
}
];
没有函数包装:
people.forEach(function (person) {
person.surname = 'Baz'; // No error. Works in console.
});
使用函数包装器:
function changeSurname(people) {
people.forEach(function (person) {
person.surname = 'Baz'; // Error warning me that value assigned to primitive will be lost.
});
}
changeSurname(people);
这两者在控制台中产生相同的输出(姓氏更改为“baz”)。
我认为这与对象引用以及 person 指向的内容有关,但我不确定具体是什么。
为什么我会看到这个错误?
WebStorm 试图拯救我的潜在错误是什么?
【问题讨论】:
-
让变量成为常量,使内部对象基本类型。如果您需要更改其中的值,请不要使其成为常量,使用
var声明变量 -
@AkshayKhandelwal 我不相信这是真的。即使使用
var,我仍然会收到错误消息。const使事情保持不变。let将变量范围限定为块范围。 -
@Rayon 但这是我的困惑,据我所知,价值没有丢失。如果您复制代码(带有函数包装器的代码),则姓氏会正确更改。我是否误解了丢失的内容?因为我没有看到任何价值丢失。
-
@MattLishman,
surname对象持有的早期值丢失了..IDE 试图说即使它是函数的参数,它也是通过引用传递的,因此 object 将更新! -
@Rayon 啊,我明白了!我误解了它指的是哪个值。鉴于更新对象正是我想要做的,这是一个相当烦人的错误......那么这种编码风格有什么问题吗? (这可能是另一个 SO 问题)
标签: javascript webstorm