Почему ESlint рад, что я могу изменить свойства объекта, если объект переназначен? нет-парам-Переприсвоить - PullRequest
0 голосов
/ 31 августа 2018

В ESLint правило no-param-переназначить, как задокументировано здесь , запрещает вам присваивать значение параметру функции.

Это позволяет избежать изменения объекта arguments функции.

Правильный способ кодирования - переназначить параметр на локальный var и вернуть var. Это хорошо для некоторых типов, но кажется бесполезным для объектов, переданных в функцию.

Например, давайте возьмем эту функцию;

function foo(param) {
    var copy = param; // This makes the linter happy
    copy.bar = 2;
    console.log('arg 0: ', arguments[0], 'param:', param, 'copy:', copy);
    return copy; // A pointless return, the original object has been modified.
}

let test = { bar: 1 };
foo(test); 
console.log(test); // Has been modified
test = foo(test); // a pointless reassignment, foo has already changed test.
console.log(test); // Same effect as previous function call.

Если честно, ESLint делает позволяющим отключить эту функцию с помощью /*eslint no-param-reassign: ["error", { "props": false }]*/; но я должен задаться вопросом почему ?

Смысл этого правила состоит в том, чтобы избавиться от изменчивости и сохранить объект arguments в чистоте, но простое переназначение объекта не сделает этого.

Единственный способ действительно сделать это - глубоко клонировать параметр и присвоить его переменной области действия функции.

Я что-то здесь упускаю?

1 Ответ

0 голосов
/ 31 августа 2018

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

function foo(param, flag) {
    var copy = flag ? param : {...param};
    copy.bar = 2;
    console.log('arg 0: ', arguments[0], 'param:', param, 'copy:', copy);
    return copy; // A pointless return, the original object has been modified.
}

Теперь он не может определить, содержит ли copy тот же объект, что и param, или клон, это зависит от значения flag.

Или как-то так:

function foo(param) {
    var copy = param;
    var copy2 = copy;
    var copy3 = copy2;
    copy3.bar = 2;
    console.log('arg 0: ', arguments[0], 'param:', param, 'copy:', copy3);
    return copy3;
}

Это потребует отслеживания всей цепочки ссылок, чтобы определить, что copy3 совпадает с param.

Отслеживать это не невозможно, оптимизаторы часто делают это. Но это может быть излишним для линтера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...