我正在使用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
我很困惑,我该怎么解释这个?
答案 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 > 4
为true
,我们会进入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)
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; // false
或5 > 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”。
我希望这会有所帮助。