繁体   English   中英

分配给原语的值将丢失

[英]Value assigned to primitive will be lost

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

分配给基元的值将丢失

但是,在控制台中进行测试时,我不会“丢失”任何值。

这仅在循环位于 function 内部时发生。

下面是此错误的示例:

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

    {
        name: 'Bar',
        age: 51,
        surname: 'FooBar'
    }
];

没有 function 包装器:

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

使用 function 包装器:

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

changeSurname(people);

这两个在控制台中产生相同的 output(姓氏更改为“baz”)。

我认为这与 object 参考和person指向的内容有关,但我不确定到底是什么。

为什么我会看到这个错误?

WebStorm 试图将我从哪些潜在错误中拯救出来?

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

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

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

primitive.vowels;
// => undefined

这将导致“丢失”的价值。

它只在函数内部捕获这个“错误”这一事实似乎是一个应该报告的彻头彻尾的错误。

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

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

person['surname'] = 'Baz';

我只是有同样的问题。

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

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

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

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

我在角度自定义指令方面遇到了类似的问题。

下面是我的自定义指令:

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;
            }
         }
      }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM