分配给基元的值将丢失

Mat*_*man 29 javascript webstorm

如果我有一个对象数组,并循环遍历它们为每个对象分配一个属性值,WebStorm警告我:

分配给基元的值将丢失

但是,在控制台中进行测试时,我并没有"丢失"任何值.

这只发生在循环在函数内部时.

以下是此错误的示例:

let people = [
    {
        name: 'Foo',
        age: 21,
        surname: 'FooBar'
    },

    {
        name: 'Bar',
        age: 51,
        surname: 'FooBar'
    }
];
Run Code Online (Sandbox Code Playgroud)

没有函数包装器:

people.forEach(function (person) {
    person.surname = 'Baz'; // No error. Works in console.
});
Run Code Online (Sandbox Code Playgroud)

使用函数包装器:

function changeSurname(people) {
    people.forEach(function (person) {
        person.surname = 'Baz'; // Error warning me that value assigned to primitive will be lost.
    });
}

changeSurname(people);
Run Code Online (Sandbox Code Playgroud)

这两个都在控制台中产生相同的输出(姓氏改为'baz').

我认为这与对象引用和person指向的内容有关,但我不确定究竟是什么.

为什么我看到这个错误?

WebStorm试图拯救我的潜在错误是什么?

rya*_*uen 19

你的代码中没有任何不当之处,WebStorm的类型推断变得有点混乱(JavaScript的这方面特别令人困惑).

它的linter看到一个字符串,并假设你会尝试这样的事情:

var primitive = "september";
primitive.vowels = 3;

primitive.vowels;
// => undefined
Run Code Online (Sandbox Code Playgroud)

哪会导致"失去"的价值.

事实上它只是在一个函数中捕获这个'错误'似乎是一个应该报告的彻头彻尾的bug.

为了进一步理解这个奇怪的JavaScript部分,我在这里推荐Angus Croll的优秀深度文章.

  • 2021 年:WebStorms 行为仍然存在 (3认同)
  • 我找不到这个bug报告.但是,我无法再在WebStorm的更高版本上复制此功能.不幸的是我不记得我看到这个bug的版本但似乎已经解决了! (2认同)
  • 我使用的是Webstorm,当前最新版本,并且存在相同的问题。 (2认同)

Flo*_*n f 6

如果您使用方括号,JetBrains 编辑器(WebS/PhpS)将不会显示任何错误。

person['surname'] = 'Baz';
Run Code Online (Sandbox Code Playgroud)