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