user-5eb763c0efd2a6d5

Как исправлять такие ошибки линтера error Assignment to function parameter 'a' no-param-reassign? Почему вообще это ошибка? https://ru.hexlet.io/code_reviews/200428

20 0

Здравствуйте! Можно смело гуглить ошибки линтера. Посмотрите официальную документацию eslint. Ваша ошибка связана с тем, что вы используете одинаковые имена для аргументов функции и объявляете переменные с такими же именами уже внутри самой функции.

0

Roman Kozlov, Ничего внутри функции я не объявляю, можете посмотреть код-ревью.

0

user-5eb763c0efd2a6d5, Правило говорит, что нельзя перезаписывать параметры. Свои значения они получат из аргументов при вызове функции.

1

Dmitry Fedotov, Это же не ошибка синтаксиса изменять значения входных параметров внутри функции, почему это нельзя? Ну а если нельзя то пусть в самом языке это запретят. Ну правда, мне что же, еще две дополнительные переменные объявлять внутри функции и копировать в них значения входных параметров, чтобы линтер не чихал по этому поводу?

0

user-5eb763c0efd2a6d5, скажите, зачем вам нужно изменять параметры?

0

Dmitry Fedotov, Как зачем, алгоритм у меня так устроен, что нужно изменять входной параметр:

const foo = (x) => {
  x = x + 1;
  return x;
}

0

user-5eb763c0efd2a6d5, линтер пишется не людьми с улицы. А программистами с большим опытом. И линтеру нужно следовать по началу это кажется мелочью. Только через некоторое время можно оценить весь кайф однотипного и понятного кода.

0

user-5eb763c0efd2a6d5, Если вам нужно так сделать, то не обязательно перезаписывать параметр.
const foo = (x) => x + 1;

0

Dmitry Fedotov, Это просто наглядный пример. Хорошо, тогда такой пример:

const factorial = (n) => {
  let res = 1;
  while (n > 0) {
    res * = n;
    n--;
  }
  return res;
}

Или вы и здесь скажете, мол, ну объявляйте еще одну переменную-счетчик i от нуля до n. Или скажете: "а не нужно использовать итеративный алгоритм, используйте рекурсию." Почему мне нужно выбирать из того, что линтер принимает? Если язык разрешает, - значит не запрещено. Кстати, в этом коде линтер выдаст уже две ошибки: no-param-reassign и no-plus-plus. Мне что-же, еще и от инкремента(++)/декремента(--) отказаться из-за линтера? Я уже догадываюсь, что эти все ошибки - это все настраиваемо в настройках линтера, ну так должно быть. Вот вам еще кусочек кода из текущей задачи, тут счетчик итераций не всунешь:

while (b !== 0) {
  [a, b] = [b, a % b];
}

0

user-5eb763c0efd2a6d5, Ну вы же видели решение учителя и там параметры не перезаписываются.

Если язык разрешает, - значит не запрещено

Язык много чего разрешает, это не значит, что нужно писать неграмотный код, который в будущем может привести к ошибкам.

Мне что-же, еще и от инкремента(++)/декремента(--) отказаться из-за линтера?

Именно. В следующем уроке вам даже объяснят зачем это нужно. Правила линтера нужны для того, чтобы был стандарт и порядок. ПДД с такой же целью существуют. Вы же не скажете "Я хочу ехать по встречке или не хочу стоять на красном светофоре" потому что вы можете. Вы то конечно можете, но к чему это приведет? Это пока вводный курс, поэтому начинайте приучать себя к линтеру сразу, чтобы потом не было сложностей. Как уже говорил выше fessan через время вы оцените его пользу.

0

fessan, А завтра те люди (программисты с большим опытом) решат изменить настройки линтера и что тогда?

0

Настройки линтера вы можете и сами изменить если будет нужно. Другое дело стандарт написания кода. Хекслет придерживается стандарта от Airbnb. Советую ознакомиться, там много полезного.

0

user-5eb763c0efd2a6d5, вольному воля. Всегда были люди идущие против правил и законов. Но потом не удивляйтесь что наш код можно будет легко читать любому, а ваш - только вам.

0

Так для этого и существуют стандарты, чтобы не было таких ситуаций, которые вы описали. К слову все разработчики пишут по таким стандартам. Зачем изобретать велосипед и писать каждый раз, как вздумается, по настроению, когда специалисты уже написали набор правил, которые избавляют вас от этого. Нужно лишь им следовать. Если вы пишете код по своему, а коллега по своему, то как вы придете к согласию?

0

Dmitry Fedotov, Вы повторили мои догадки - не используйте императивный стиль, а используйте рекурсию. Но почему? Потому что у учителя, видите ли, рекурсия? Это что, весомый довод?

0

user-5eb763c0efd2a6d5, Я говорил про стандарт написания кода, а не стиль. Это разные вещи.

0

Dmitry Fedotov, Погодите, а те специалисты, что пишут стандарты языка и стиля - они чем пользуются, когда их придумывают, откуда они их берут? Откуда берутся сами эти специалисты, если они не пишут что-то свое - новое, а только и пользуются уже написанными кем-то до них стандартами и библиотеками? Извините, но мне кажется это полная чушь. Я вам говорю, завтра кто-то где-то чихнет, и что все проекты переводить под этот чих?

UPD: А насчет стандарта кода, то это выбирает главный менеджер проекта, кто задает тон команде. И линтер тут ни причем. Настроят линтер так как им нужно. Почему мне нужно "лечить" чихи местного линтера? Разве тут где-то был указ писать в декларативной парадигме или в функциональном стиле? Тогда нафига, извините, тут изучаются циклы?

0

user-5eb763c0efd2a6d5, в конечном итоге все будет приведено к функциям высшего порядка. А циклы изучают что бы знать основы. Вам если так хочется подискутировать на эту тему заходи в слак. Тут не слишком удобно общаться.

0

user-5eb763c0efd2a6d5, Давайте разберемся с терминологией.
Стандарт языка - это ECMAScript. Этот документ описывает, как должен работать язык. JavaScript это всего лишь реализация того, что описано в этом стандарте. Точнее, чем описано в этом файле, вы информацию больше нигде не найдете. То есть стандарт - это просто текстовое описание того, как должен работать язык, а JS физическая реализация.

Откуда берутся сами эти специалисты

Стандартом занимается специальный комитет tc39. Туда входят гугл, фейсбук, интел и многие другие. Периодически они собираются и решают каким будет ECMAScript-JavaScript в следующем году.

А насчет стандарта кода, то это выбирает главный менеджер проекта, кто задает тон команде.

В каждой компании может быть свой стандарт написания кода, я согласен. Не обязательно следовать Airbnb или какому-то другому. Линтер всего лишь настраивается на конкретный стандарт, который вы ему укажите и проверяет ваш код в соответствии с ним, вот и все. Повторюсь, здесь на Хекслете придерживаются Airbnb.

Почему мне нужно "лечить" чихи местного линтера?

Потому что вы учитесь на Хекслете. Если вы придете работать в компанию где придерживаются другого способа, вам придется с ним мириться и следовать ему.

Разве тут где-то был указ писать в декларативной парадигме или в функциональном стиле? Тогда нафига, извините, тут изучаются циклы?

Обучение на Хекслете построено через рефакторинг. То есть прежде чем писать в функциональном стиле или ООП, начинаем с императивного. Это сделано для того, чтобы понимать зачем был придуман тот или иной подход, какие проблемы он решает и когда нужно использовать или нет. Курсы выстроены очень последовательно, просто следуйте им, ну и задавайте вопросы конечно. Если не зарегистрированы в slack, то настоятельно рекомендую это сделать. Там гораздо больше людей сможет вам помочь)

0

user-5eb763c0efd2a6d5, приветствую!

Сообщения линтера не являются ошибками, которые влияют на работоспособность и логику кода. И при желании вы можете их игнорировать. Но отмечу, что правила линтера направлены на то, что бы уведомить разработчика о том, что те или иные участки кода могут привести к возможным ошибкам или непредсказуемому поведению. А также, следование правилам линтера помогает сделать код чище и более понятным для других. Вот на примере ошибки линтера, которая появилась у вас no-param-reassign. Она говорит о том, что не рекомендуется присваивать значения входящим параметрам функции, так как это может привести к изменению входящих данных (а такое поведение возможно не ожидается). Если в функцию передаются данные, которые передаются по ссылке: массивы, объекты, тогда они будут изменены:

const changeFirstElement = (arr) => {
  arr[0] = 'value';
  return arr;
};

const data = [1, 2, 3];
const newData = changeFirstElement(data);

// изменился начальный массив
console.log(data); // => [ 'value', 2, 3 ]
console.log(newData); // => [ 'value', 2, 3 ]

Соответственно, если требуется такое поведение, можно данную ошибку проигнорировать или по рекомендации линтера, внутри функции переприсвоить входящий параметр другой переменной, а после с ней работать. Но если вы не хотели получить такой эффект, в этом случае данное предупреждение будет полезным. Также отмечу, что как следствие, соблюдение данного правила линтера помогает писать иммутабельный код (иммутабельность рассматривается в дальнейших курсах), который легче отлаживать, тестировать и поддерживать.

1

Похожие вопросы

Александра Сагидуллина 03 марта 2020 →

Добрый день. Тесты прошли , но линтер ругается. Никак не пойму, как можно перезаписать переменные в функции...

Yana Khaustova 26 февраля 2020 →

https://ru.hexlet.io/code_reviews/221050 - что-то застряла, не могу понять почему цикл не выполняетс

Егор Попов 15 февраля 2020 →

Здравствуйте!Я не смог сделать задание, поэтому взял код учителя и пытался в нем разобраться, но я не поним...

Сергей Бондарюк 10 февраля 2020 →

Сделал задание следующим образом: Ревью (https://ru.hexlet.io/code_reviews/212125#) Но линтер ругается вот...

Виталий Семёнов 04 февраля 2020 →

На Repl.it (https://repl.it/repls/BurdensomeOldMinimalsystem) выполняется, а в задании Maximum call stack s...

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Javascript, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →