我刚注意到一种奇怪的行为。我肯定不是第一个注意到它但我想了解发生了什么。
为什么true || true ? 'foo' : 'bar'
会解析为'foo'
是什么使它与解析为true || (true ? 'foo' : 'bar')
的{{1}}不同?
jsFiddle:http://jsfiddle.net/tgdx5u8s/
答案 0 :(得分:2)
... || ...
binds tighter而不是... ? ... : ...
,因此您的语句被解析为:
(true || true) ? 'foo' : 'bar'
true || true
为true
,因此您获得了'foo'
。
答案 1 :(得分:2)
关于第一个
true || true ? 'foo' : 'bar'
与:
相同(true || true) ? 'foo' : 'bar'
基本上是这样的:
true ? 'foo' : 'bar'
关于第二个
true || (true ? 'foo' : 'bar');
与:
相同true || 'foo';
所以true
或其他任何事情都是true
(甚至不需要评估'foo'
那个......)
答案 2 :(得分:2)
关键区别在于,如果没有括号,||
优先于?:
。更详细:
第一个案例
true || true ? 'foo' : 'bar'
由于||
优先于?:
,因此等同于:
(true || true) ? 'foo' : bar'
||
运算符返回左操作数,如果它是真的,在这种情况下它是(否则它会返回正确的操作数)。
所以这解决了:
true ? 'foo' : 'bar'
解析为'foo'
。
第二种情况
true || (true ? 'foo' : 'bar')
解析为:
true || 'foo'
同样,||
运算符返回左操作数,如果它是真实的,在这种情况下它是。所以这解析为true
。
答案 3 :(得分:0)
这是因为操作顺序。通常是||在?之前处理?:但是当你添加大括号时,大括号内的表达式在||。
之前被计算所以第一个结果是真的吗? '富' :' bar'第二个结果为真|| '富'
可以在https://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx
找到订单答案 4 :(得分:0)
并不是说我想反对多数,但||
的优先级不是观察到的行为的原因,而是括号的优先级。构造logical or expression '?' expression ':' conditional expression
只不过是一个稍微受限制的IF '(' expression ')' statement ELSE statement
曾经的时间,当内存以千字节为单位时,完全优化的编译器运行和没有完全优化的编译器运行之间的差异以小时为单位进行测量如果幸运的话,监视器有50行,每行80个字符,可以使计算机和编译器更简单,更小。不是用户。
因此,如果您使用?:;
,则不需要if
,if
后的表达式周围没有括号,如果您有多个,则没有大括号if
之后的一行。在我谦卑的经历中,缺乏括号的需要是大多数的原因,好吧,让我们称之为烦恼。
将您的问题转化为更具可读性的内容:
var a;
if(true || true){
a = 'foo';
} else {
a = 'bar';
}
第二个引发错误,因为它的语法不正确,而不是让你挠头:
var a;
if(true || if(true){a='foo';}else{a='bar';})/*noop*/;
?:;
构造的优点是它能够填充声明的右侧。第一个例子可以很容易地简化为:
a = true || true ? 'foo' : 'bar';
如果添加括号尽管多余,我发现它更具可读性:
a = (true || true) ? 'foo' : 'bar';
但这可能更多的是个人品味。