オブジェクトの配列があり、それらをループして各オブジェクトの属性に値を割り当てている場合、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が私を救おうとしている潜在的なバグは何ですか?
コードに不適切なものは何もありません。WebStormの型推論は少し混乱しています(JavaScriptのこの側面は特に混乱しています)。
そのリンターは文字列を見て、あなたがこのようなことを試みると仮定します:
var primitive = "september";
primitive.vowels = 3;
primitive.vowels;
// => undefined
これは「失われた」価値につながります。
関数内のこの 'エラー'をキャッチするだけキャッチするという事実は、報告すべき完全なバグのように思えます。
JavaScriptのこの奇妙な部分をさらに理解するために、Angus Crollの優れた詳細な記事 here をお勧めします。
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;
}
}
}
}
角括弧を使用する場合、JetBrainsエディター(WebS/PhpS)はエラーを表示しません。
person['surname'] = 'Baz';