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;