分配给基元的值将丢失

时间:2016-06-20 13:07:27

标签: javascript webstorm

如果我有一个对象数组,并循环遍历它们为每个对象赋值,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试图拯救我的潜在错误是什么?

4 个答案:

答案 0 :(得分:14)

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

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

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

primitive.vowels;
// => undefined

这会导致“失去”的价值。

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

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

答案 1 :(得分:0)

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

下面的

是我的自定义指令:

margin:0 1.25% 0 0;

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

.box{
  background:orange;
  float:left;
  width:19%;
  height:100px;
  margin:0 1.25% 0 0; //changed
}

.box:last-of-type{
  margin-right: 0%;
  float:right;
}

答案 2 :(得分:0)

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

Height

答案 3 :(得分:0)

我只是遇到了同样的问题。

您还可以要求WebStorm禁用对下一行的检查,但是我决定改用structure(list(userID = structure(c(2L, 2L, 3L, 1L, 2L), .Label = c("E","H","M"), class = "factor"), pred_task = structure(c(1L, 2L, 2L, 1L, 2L), .Label = c(" E", " H"), class = "factor"), obs1_task = structure(c(1L, 1L, 2L, 1L, 1L), .Label = c(" E", " H"), class = "factor"), obs2_task = structure(c(1L, 3L, 3L, 1L, 2L), .Label = c(" E", " M", " NA"), class = "factor"), exp1_task = structure(c(3L, 2L, 2L, 1L, 2L), .Label = c("E", "H", "M"), class = "factor"), exp2_task = structure(c(4L, 4L, 3L, 1L, 2L), .Label = c("", "E", "H", "M"), class = "factor"), postPOE_task = structure(c(4L, 2L, 1L, 5L, 3L), .Label = c("0", "1", "2", "3", "M"), class = "factor"), E = c(2L, 1L, 1L, 5L, 1L), M = c(1L, 3L, 4L, 1L, 3L), H = c(2L, 0L, 0L, 0L, 0L), EE = c(1L, 0L, 0L, 4L, 1L), EM = c(0L, 0L, 0L, 1L, 0L), EH = c(1L, 0L, 0L, 0L, 0L), MM = c(0L, 0L, 0L, 0L, 0L), ME = c(0L, 0L, 1L, 0L, 1L), MH = c(0L, 1L, 2L, 0L, 1L), HH = c(0L, 1L, 0L, 0L, 2L), HE = c(0L, 1L, 0L, 0L, 0L), HM = c(NA, NA, NA, 0L, NA)), class = "data.frame", row.names = c("3108", "3207", "3350", "3961", "4021")) 循环:

for of

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