如何避免JavaScript中的短路评估?

Dun*_*Luk 5 javascript design-patterns if-statement boolean

我需要执行一个&&语句的两面,但如果第一部分返回则不会发生这种情况false.例:

function doSomething(x) {
    console.log(x);
}

function checkSomething(x) {
    var not1 = x !== 1;
    if (not1) doSomething(x);

    return not1;
}

function checkAll() {
    return checkSomething(1)
        && checkSomething(3)
        && checkSomething(6)
}

var allValid = checkAll(); // Logs nothing, returns false
Run Code Online (Sandbox Code Playgroud)

这里的问题是doSomething(x)应该记录3和6,但因为checkSomething(1)返回false,其他检查不会被调用.运行所有检查并返回结果的最简单方法是什么?

我知道我可以保存变量中的所有值并随后检查它们,但是当我进行大量检查时,这看起来并不是很干净.我正在寻找替代品.

bre*_*sky 10

使用单个&.这是一个按位运算符.它将执行所有条件,然后返回结果的按位总和.

 function checkAll() {
    return checkSomething(1)
      & checkSomething(2)
      & checkSomething(3)
 }
Run Code Online (Sandbox Code Playgroud)

  • `return !!(checkSomething(1)&checkSomething(2)&checkSomething(3))`得到布尔值 (8认同)
  • 这将返回"1"或"0",而不是"真"或"假",但它似乎是一个富有成效的方向. (2认同)

Nin*_*olz 5

您可以将比较结果相乘并将其转换为布尔值.

function checkSomething(x) {
    var not1 = x !== 1;
    if (not1) alert(x);
    return not1;
}

function checkAll() {
    return !!(checkSomething(1) * checkSomething(2) * checkSomething(3));
}

document.write(checkAll());
Run Code Online (Sandbox Code Playgroud)

或者采取一些数组方法:

function checkAll() {
    return [checkSomething(2), checkSomething(2), checkSomething(3)].every(Boolean);
}
Run Code Online (Sandbox Code Playgroud)