Присвоение значений внутри условного оператора - PullRequest
1 голос
/ 09 мая 2019

Является ли хорошей практикой назначение значений переменным внутри условного оператора?Речь идет об операторе conditonal / turnery, а не об операторе if

 a===1 ? (b=2) : (b=0)

При использовании этого метода появляется предупреждение lint.

1 Ответ

3 голосов
/ 09 мая 2019

Нет, использование назначения в качестве назначения редко является хорошей идеей - код намного легче читать и понимать, когда условия только тестируют условия, а не когда эти условия также имеют побочные эффекты. В этом случае вы можете исправить это, указав 2 и 0 в качестве выражений справа:

const b = a === 1 ? 2 : 0;

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

const regex = /\w(?=(\w))/g;
const str = 'foo';

let match;
while (match = regex.exec(str)) {
  console.log(match[1]);
}

Альтернативы, без присвоения внутри условия while:

// Requires while(true):
const regex = /\w(?=(\w))/g;
const str = 'foo';

while (true) {
  const match = regex.exec(str);
  if (!match) {
    break;
  }
  console.log(match[1]);
}

или

// A bit WET:
const regex = /\w(?=(\w))/g;
const str = 'foo';

let match = regex.exec(str);
while (match) {
  console.log(match[1]);
  match = regex.exec(str);
}

Но это может быть основано на мнении.

Обратите внимание, что (ab) использование условного оператора в качестве замены для if/else обычно встречается в минимизированном коде , но это прекрасно, поскольку минимизированный код предназначен не только для чтения, а только для чтения. разобран. Это также допустимая техника в коде гольф.

Если вы хотите назначить несколько переменных внутри условного выражения, вы можете использовать деструктуризацию:

const a = 689;
const [b, c] = a === 1 ? [2, 1] : [0, 3];
console.log(c);

Или, если переменные тесно связаны, что кажется вероятным, вероятно, было бы лучше использовать объект (или массив) вместо нескольких автономных переменных:

const a = 689;
const obj = a === 1 ? { b: 2, c: 1 } : { b: 0, c: 3 };
console.log(obj);
...