如果我有一个对象数组,并循环遍历它们为每个对象赋值,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试图拯救我的潜在错误是什么?
答案 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
结果实际上使我的代码更具可读性,所以我很高兴。