在条件运算符内赋值

Assigning values inside conditional operator

在条件运算符中为变量赋值是一种好习惯吗?这是关于 conditonal/turnery 运算符而不是关于 if 语句

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

我在使用此方法时收到 lint 警告。

不,使用赋值作为赋值很少是一个好主意 - 当条件只有 test 条件时代码更容易阅读和理解,而不是当这些条件也有时side-effects。在这种情况下,您可以修复它,将 20 作为右侧的表达式:

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

但这可能是 opinion-based。

请注意,(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);