分配给原语的值将丢失

Value assigned to primitive will be lost

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

Values assigned to primitive will be lost

但是,在控制台中测试时,我没有 "lose" 任何值。

只有当循环在函数内部时才会发生这种情况。

下面是此错误的示例:

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 试图将我从哪些潜在错误中拯救出来?

我遇到了与 angular 自定义指令类似的问题。

下面是我的自定义指令:

function customDirective() {
      return {
        scope: {
          model: '='
        }
        link: function(scope) {
                scope.resetModel = function() {
                    scope.model.name = null;   //In these lines I was getting the above 
                    scope.model.email = null;  //mentioned warning in webstorm.
                }
            }
      }
}

在完成 $compile docs 之后,我决定使用下面的代码来解决此警告,并且可以很好地绑定到子范围和父范围,当然是的,除非你的模型是一个对象引用。

function customDirective() {
       return {
         scope: {
            model:'<' // Please refer the above linked angular docs for in detail explanation.
         }
         link: function(scope) {
            scope.resetModel = function() {
               scope.model.name = null;
               scope.model.email = null;
            }
         }
      }
}

你的代码没有任何不妥之处,WebStorm 的类型推断有点混乱(JavaScript 这方面特别混乱)。

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

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

primitive.vowels;
// => undefined

这将导致 'lost' 值。

它仅 捕获 这个 'error' 函数内部的事实似乎是一个应该报告的彻头彻尾的错误。

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

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

person['surname'] = 'Baz';

我刚遇到同样的问题。

您也可以要求 WebStorm 禁用对下一行的检查,但我决定改用 for of 循环:

for (person of people) {
    person.surname = 'Baz';
}

它实际上使我的代码更具可读性,所以我很高兴。

这是一个无关紧要但可能有用的答案。我收到此错误消息 b/c 我忘记更新函数的 JSDoc return:@return String 而不是 @return Object|undefined,并且我试图访问 returned对象的属性 - HTH