Javascript 什么';三元运算和这种选择之间的区别是什么?

Javascript 什么';三元运算和这种选择之间的区别是什么?,javascript,Javascript,我想知道为什么以下两个表达式返回相同的结果,即val_bool始终是布尔值[true或false]时: ('oninput' in document.documentElement && !val_bool) && 'first result' || 'second result'; 及 如果打开控制台并运行以下操作: var val_bool = true; ('oninput' in document.documentElement && !

我想知道为什么以下两个表达式返回相同的结果,即
val_bool
始终是布尔值[
true
false
]时:

('oninput' in document.documentElement && !val_bool) && 'first result' || 'second result';

如果打开控制台并运行以下操作:

var val_bool = true;
('oninput' in document.documentElement && !val_bool) && 'first result' || 'second result';
输出第二个结果
。当我更改为三元时,输出相同的结果:

var val_bool = true;
('oninput' in document.documentElement && !val_bool) ? 'first result' : 'second result';

我不熟悉第一个逻辑表达式解析其结果的机制。

在三元表达式中
x?y:z
第一部分作为布尔值计算,并返回相应的值

在另一行代码
x&&y|z
中,情况有所不同:基本上是2个表达式,而不是1个表达式

此链接在此处很有用:

我们可以看到,
&&
| |
已经离开了右关联性,这意味着首先计算左部分。以下几行相等:

x && y || z
(x && y) || z
表达式
x&&y
首先求值,
x&&y|z
变为
result(x,y)|z

当结果不同而输入相同时的示例:

const logical=(x,y,z)=>x&&y|z;
常数三元=(x,y,z)=>x?y:z;
console.log(
逻辑(1,0,1)//1&&0 | | 1=>0 | | 1=>0 | | 1=>1__
)
console.log(
三元(1,0,1)//如果(1)那么0;否则1=>\uuuu0\uuuu(布尔值(1)==true)

)
只为子孙后代发布这篇文章

我在一篇文章中找到了一句名言。在操作符| |和&下的某个地方,有一段内容如下:

|
&&
表达式的结果始终是 操作数之一,而不是测试结果(可能是强制的)

事实证明,我一直在从评估的角度来看问题,而不是从潜在价值的角度来看问题

因此,我最初的问题有以下表达:

('oninput' in document.documentElement && !val_bool) && 'first result' || 'second result';
让我们用简单变量替换操作数:

var a = true;
var b = true;
var c = 'first result';
var d = 'second result';

(a && !b) && c || d;
首先,
(a&&!b)
将求值为
false
,因为
a
true
!b
false
true&&false
false

其次,
false
结果将使用
c
(false)&&c
)进行评估。同样,我们以
false
结束,因为
c
将计算为字符串(
true
),而
false&&true
false

最后,
false
的结果将使用
d
进行计算,只有这一次操作符是
|
,而
false | | true
的计算是
true
。但是,返回的不是计算结果,而是基础值,即
第二个结果

当然,当我将
b
的原始值从
true
更新为
false
时,情况会发生变化。
| |
左侧的所有内容都计算为
true
,因此当您计算
true | | true
时,您会得到
true
,但问题是哪个
true
。这是
| |
左边的
true
,因为如果我们计算
'a'| |'b'
,结果将是'a'


所有这些,它并不等同于函数中的三元运算符,但两个特定表达式的结果[如果变量类型保持不变]应该是相同的。

相关阅读:您是否使用开发人员控制台来测试这两个语句?他们的表现不一样。所以,你可能会被否决,因为你不明白的地方还不完全清楚。我不认为这一定是你的错(你不知道你不知道什么),但这确实让这个问题很难回答。您是否已经了解布尔逻辑运算符的机制以及短路是如何工作的?你知道JS中的逻辑运算符是如何将其操作数转换为“truthy”或“falsy”的吗?为了弄清楚下行表决,正如我下行表决时所说:。如果你查阅关于各种逻辑运算符在JavaScript中如何工作的文档,你会得到你的答案。@zzzzBov老实说,我不理解反对票,但没问题。是的,我在Chrome控制台上尝试了这两种方法,得到了相同的结果。我试着在网上搜索三元替代品和速记,但我想如果我确切知道我在找什么会更有效。非常感谢。我在网上找到这篇文章。在操作符
|&
&
下,我发现了这样一句话:“一个
|&
&&
表达式的结果总是其中一个操作数的基础值,而不是测试的(可能是强制的)结果。”我一直认为计算结果是布尔值,而不是潜在的价值…在看了一些例子之后,现在变得更加清晰了。我将发布答案,只是为了解决我发布的实际问题。我很高兴我能提供帮助。
var a = true;
var b = true;
var c = 'first result';
var d = 'second result';

(a && !b) && c || d;