web-dev-qa-db-ja.com

プリミティブに割り当てられた値は失われます

オブジェクトの配列があり、それらをループして各オブジェクトの属性に値を割り当てている場合、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が私を救おうとしている潜在的なバグは何ですか?

25
Matt Lishman

コードに不適切なものは何もありません。WebStormの型推論は少し混乱しています(JavaScriptのこの側面は特に混乱しています)。

そのリンターは文字列を見て、あなたがこのようなことを試みると仮定します:

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

primitive.vowels;
// => undefined

これは「失われた」価値につながります。

関数内のこの 'エラー'をキャッチするだけキャッチするという事実は、報告すべき完全なバグのように思えます。

JavaScriptのこの奇妙な部分をさらに理解するために、Angus Crollの優れた詳細な記事 here をお勧めします。

15
ryanpcmcquen

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;
            }
         }
      }
}
0
Ashok M A

角括弧を使用する場合、JetBrainsエディター(WebS/PhpS)はエラーを表示しません。

person['surname'] = 'Baz';
0
Florin f