为什么 |和 ||类似于 Javascript 中的分号?

Why | and || are similar to a semicolon in Javascript?

提问人:testing_22 提问时间:9/8/2020 更新时间:9/8/2020 访问量:130

问:

我在 Chrome 上的控制台上测试了一些东西,然后我运行了那段代码:

alert() | window.confirm();
alert() || window.confirm();

我的问题是在不使用分号的情况下在一行中同时运行警报和确认方法。事实证明,两者 |和 ||工作,我无法想象它为什么有效,首先是因为 || 表示一个 OR 运算符,它应该运行其中一个而不是两个,其次 |我不知道那是什么。有人可以解释发生了什么以及还有什么应该起作用而不是;

JavaScript的

评论

0赞 Sebastian Simon 9/8/2020
请参阅这个符号在 JavaScript 中是什么意思?,以及 MDN 上关于表达式、运算符语句的文档。
1赞 Sebastian Simon 9/8/2020
逗号运算符在这里会更合适。
0赞 Gerardo Furtado 9/8/2020
逗号运算符返回最后一个值。因此,我认为这里更合适(和更清晰)的不是逗号运算符或 OR 或按位 OR 或其他什么,而只是 2 行代码,每个方法一行,就像这个答案一样。
0赞 testing_22 9/8/2020
是的,我同意用单独的行更清楚。但是提到逗号还是好的,我几乎忘记了这种可能性。
0赞 testing_22 9/8/2020
感谢大家分享这些链接。这真的很有帮助

答:

3赞 Brad 9/8/2020 #1

alert()返回 ,这是 false-y。因此,对于您的示例,仍将运行。undefinedwindow.confirm()||

至于单个管道字符,这是一个按位 OR,您可以在此处阅读: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#Bitwise|

评论

0赞 testing_22 9/8/2020
感谢您的链接 |意义。顺便说一句,如果 undefined 为 false,为什么它仍然只运行 alert() 和 alert() 中的第一个成员?不应该像 0 & 0 -> 0 一样吗?
0赞 Brad 9/8/2020
@testing_22 仍然计算使用逻辑表达式的函数。也就是说,如果你有 ,两个函数都必须执行。假设它们都返回,那么就像 一样,其计算结果当然是 。对于 的情况,有“短路”的概念。这有点优化。JavaScript 知道,如果 OR 运算符的任何一端为真,则表达式的计算结果为 。因此,如果返回 true,它可以停在那里并立即计算为 。 不执行。fn1() && fn2()fn1fn2falsefalse && falsefalsefn1() || fn2()||truefn1()truefn2()
1赞 Sebastian Simon 9/9/2020
“如果 undefined 是 [falsy,] 为什么它仍然只运行 alert() 和 alert() 中的第一个成员” — 你还能如何确定?逻辑连词和断句从左到右计算它们的操作数,直到析取达到真值或连词达到假值。然后返回该值。如果它们未达到这样的值,则返回最后一个操作数。“如果你有 fn1() & fn2(),则必须执行函数 fn1 和 fn2 — 如果返回一个虚假值,则不执行。应用了类似的短路评估。alert() === undefinedfn1fn2
0赞 Brad 9/9/2020
@user4642212是正确的......对不起,我应该更清楚,在我的脑海中举例,然后回来了.:-)&&fn1fn2true
3赞 CertainPerformance 9/8/2020 #2

分号表示语句的结尾。

如果您还不知道,表达式是计算结果为值的东西。例如,、 和 都是表达式,因为它们的计算结果为值。5'foobar'myFn()

语句可以由多个表达式组成。例如,将表达式传递到函数调用中,函数调用返回一个值,该值被赋值给 。const result = fn('foo')'foo'result

在代码中,两行都由两个表达式组成,但每行恰好是一个语句。用这句话:

alert() || window.confirm()

将首先评估。由于 returns ,运算符随后计算右侧的表达式,即 。alertalertundefined||window.confirm()

您可以使用 、 或 等运算符将多个表达式放在一起。您还可以通过将每个表达式作为单独的语句来计算多个表达式,例如|||=

alert();
window.confirm();

两者都将导致出现一个警报框和一个确认对话框。

评论

0赞 Sebastian Simon 9/8/2020
“您可以使用 |||= 等运算符将多个表达式放在一起”这句话可能会造成混淆。不能将函数调用放在运算符链中的任何位置,除非在末尾。此外,这里可以提到逗号运算符。=
0赞 CertainPerformance 9/8/2020
函数调用可以放在示例中 like 的右侧,我并没有试图详尽地描述可能的语法,只是举个例子=const result = fn('foo')
0赞 testing_22 9/8/2020
那么&&呢?为什么它只评估第一个?
0赞 CertainPerformance 9/8/2020
如果第一个表达式为真,则@testing_22将短路(不计算第二个表达式):结果在不考虑 .同样,如果第一个是假的,则会短路:结果在不考虑的情况下。同样,不调用 ,也不调用 。||1 || 414&&false && 555false && foo()fooalert() && window.confirm()confirm
0赞 Sebastian Simon 9/8/2020
@testing_22 请看 JavaScript 有“短路”评估吗?MDN 伪造
1赞 Jiří Baum 9/8/2020 #3

是运算符,如 or ;它计算一些东西。在 的情况下,它计算一个值或另一个值是否为真。||+/||

通常,你会在类似语句的东西中使用它:但它不仅限于此;例如,您可以将结果放在变量中,然后在稍后的语句中使用它:ifif (i===0 || j===0) {...}ifhave_zero = i===0 || j===0; ...; if (have_zero) {...}

(和)算子确实有一个特殊之处:如果左边决定了答案,他们就不用费心计算右边了(称为“短路评估”)。||&&

在这里,你正在计算 ,所以它调用 ;正如其他人所指出的,这并不能确定 的答案,因此 Javascript 随后调用 。然后答案被扔掉了,因为你没有把它放在变量中或以其他方式使用它,但这没关系 - 你想调用方法,你对答案不感兴趣。alert() || window.confirm()alert()undefined||window.confirm()

评论

0赞 testing_22 9/8/2020
是的,我偶然使用了它,它出奇地有效。现在我不明白的是,为什么 alert() & alert() 在 alert() ||alert() 弹出两个,因为两者都应该是未定义的。
0赞 Jiří Baum 9/8/2020
正如其他人所指出的,就 和 而言,算作虚假;一旦得到一个错误的结果,它就不需要检查另一个值,因为无论如何,整体答案都是假的。undefined||&&&&