Подтвердить что ты не робот

Значение, присвоенное примитиву, будет потеряно

Если у меня есть массив объектов и через них прописывается атрибут каждому из них, 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 пытается спасти меня?

4b9b3361

Ответ 1

В коде нет ничего неправильного, вывод типа WebStorm немного запутан (этот аспект JavaScript особенно запутан).

Его linter видит строку и предполагает, что вы попробуете что-то вроде этого:

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

primitive.vowels;
// => undefined

Это приведет к "потерянному" значению.

Тот факт, что он только ловит эту "ошибку" внутри функции, кажется прямой ошибкой, о которой следует сообщить.

Чтобы понять эту странную часть JavaScript, я рекомендую Ангус Кроллу отличную углубленную статью здесь.

Ответ 2

У меня возникла аналогичная проблема с пользовательской директивой 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.
                }
            }
      }
}

Пройдя компилировать документы, я решил использовать приведенный ниже код, который решает это предупреждение и отлично работает с привязкой к дочернему и родительские области, да, конечно, если только ваша модель не является ссылкой на объект.

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