用Logical OR混淆输出?

时间:2017-07-28 18:45:17

标签: javascript

我正在使用Chrome开发者工具来运行以下程序。它将预期的输出记录到控制台3次(我认为预期的输出只打印2次)。

if(null||console.log("bpjoshi")||console.log("bpjoshi")||console.log("bpjoshi")){
console.log("bpjoshi");
}

它给了我3次输出。

bpjoshi
bpjoshi
bpjoshi

如果OR运算符的第一个条件求值为true,则为null,为什么它给出3个输出。

如果我运行以下代码

var x=5;
if(null||console.log("bpjoshi")||console.log("bpjoshi")||x>6){
    console.log("bpjoshi");
    }

输出如下

bpjoshi
bpjoshi

但如果我按下面的那样运行if测试,它会再次输出3次。

var x=5;
if(null||console.log("bpjoshi")||console.log("bpjoshi")||x>4){
    console.log("bpjoshi");
    }

它给出如下输出。

bpjoshi
bpjoshi
bpjoshi

我很困惑,我该怎么解释这个?

Jsfiddle link for the same

6 个答案:

答案 0 :(得分:2)

||检查表达式是否为真,它进入if。由于null不是truthy且控制台日志没有返回任何内容,因此它不是truthy,您输入if的唯一方法是基于x的条件}。

如果你在if条件||条件中给出4个语句,那么它会一个接一个地执行,看看有什么不妥。如果任何一个人是真实的,它只是停止反复并进入一侧。

var x=5;
if(null||console.log("bpjoshi")||console.log("bpjoshi")||x>6){
    console.log("bpjoshi");
    }

在上述情况下,所有状态都被执行,x>6为假。所以它没有进入,如果。

并且

var x=5;
if(null||console.log("bpjoshi")||console.log("bpjoshi")||x>4){
    console.log("bpjoshi");
    }

在这种情况下,所有语句都已执行且x>4为真,因此它输入了if并在if中打印了日志。因此你看了3次。

答案 1 :(得分:1)

这有一个真正的条件

var x=5;
if(null||console.log("bpjoshi")||console.log("bpjoshi")||x>4){
    console.log("bpjoshi");
    }

其他都是虚假的条件

你可以看到这是假的

if(console.log("bpjoshi")){
    console.log("bpjoshi");
}

答案 2 :(得分:1)

所有这些都有意义,因为console.log会返回undefined(不是true)。

if (null || console.log("bpjoshi") || console.log("bpjoshi") || console.log("bpjoshi")) {
    console.log("bpjoshi");
}

首先,评估null。这不是true,所以我们继续前进。评估下一个console.log("bpjoshi")。这会将bpjoshi打印到控制台并返回undefined。由于这不是true,我们继续前进。我们再记录两个bpjoshi。我们的||链中没有任何内容返回true,因此我们不会输入if块。

其他人类似。每次评估console.log("bpjoshi")时,它都会记录到控制台并返回undefined

var x = 5;
if (null || console.log("bpjoshi") || console.log("bpjoshi") || x > 6) {
    console.log("bpjoshi");
}

在这里,我们最终会记录两次,因为我们没有输入if块。 (||链中的所有内容都是false。)

最后,

var x = 5;
if (null || console.log("bpjoshi") || console.log("bpjoshi") || x > 4) {
    console.log("bpjoshi");
}

此处我们在评估||链时记录两次,由于x > 4true,我们会进入if块并再次记录。

如果您在console.log来电中添加不同的字符串,则所有这些都可能更容易理解。

答案 3 :(得分:1)

真正简短的回答是每次在console.log()条件内写if时, 会将其记录到控制台。在您的第一段代码中,您指示环境写入console 3次,如果if条件可以评估为true,则只有第4次写入if(null||console.log("bpjoshi") || console.log("bpjoshi") || console.log("bpjoshi")){ console.log("bpjoshi"); } 39;吨

if

这根本不是如何编写if语句。

true语句检查条件(括号中提供)是否为null is never `true` console.log("bpjoshi") is executed, but doesn't return a value console.log("bpjoshi") is executed, but doesn't return a value console.log("bpjoshi") is executed, but doesn't return a value

true

由于这些语句都没有返回if的任何内容,因此未输入true语句的var x=5; if(null||console.log("bpjoshi")||console.log("bpjoshi")||x>6){ console.log("bpjoshi"); } 分支的正文。

在此代码中:

null

if语句再次定向评估true,而不是true

它再次说要两次写入控制台,而且这些表达式都不会返回x

最后,它会测试6以查看它是否小于true,因此,if语句的console.log("bpjoshi")分支已到达而另一个console.log()第三次被开除。

理解所有这一切的关键是console是写入console的指令。可能不是写if的条件。如果您在undefined条件中包含这些陈述,则会执行 ,并且会针对true对其返回值(if)进行测试。

实际上,您永远不会看到一个已知永远不会在true条件中返回值的表达式,就像您的代码那样,因为它永远不会是print('Hello Lua')

答案 4 :(得分:1)

如果LHS truthy

Logical OR operator ||将使LHS的结果短路。

这意味着expr1 || expr2会出现以下情况;

  • expr1已调用 - 真理,expr2从未调用过,逻辑或给出expr1的结果
  • expr1已调用 - falsy,expr2已调用 - truthy,逻辑或给出了expr2
  • 的真实结果
  • expr1已调用 - falsy,expr2已调用 - falsy,逻辑或会给出expr2的错误结果

Falsy things在条件

中表现得像false
  • console.log('foo'); // undefined返回的未定义 falsy
  • null是假的

所以,

  • console.log('foo') || console.log('bar'); // undefined,但记录"foo""bar"
  • null || expr等于expr

最终,if条件的有意义位可归结为5 > 6; // false5 > 4; // true,但每次调用的console.log仍将显示控制台

答案 5 :(得分:1)

运行此代码时

var x=5;
if(null||console.log("bpjoshi")||console.log("bpjoshi")||x>6){
    console.log("bpjoshi");
}

控制台正在运行console.log(“bpjoshi”)。 console.log()输出到控制台。

所以你的代码(上面那个)正在测试是否为null,输出“bpjoshi”到控制台,输出“bpjoshi”到控制台,并测试x> 6。 因为null不是真的,并且console.log只是输出到控制台,所以唯一被测试的是x> 6,这是假的。所以你只能在控制台中看到两个“bpjoshi”。

我希望这会有所帮助。