连接`?:`JavaScript中的条件字符串

时间:2014-05-07 03:29:55

标签: javascript

我在JavaScript中设置了一个断点,并在Chrome浏览器控制台窗口中输入以下表达式:

类型的:

(((i % 12) == 0) ? '12' : (i % 12))

结果:

9

类型的:

' ' + (i < 12) ? 'AM' : 'PM'

结果:

"AM"

类型的:

(((i % 12) == 0) ? '12' : (i % 12)) + ' ' + (i < 12) ? 'AM' : 'PM'

结果:

"AM"

我的期望是最后的结果是&#34; 9 AM&#34;,这就是我想要的。这是我输入9 + "AM"后得到的结果。为什么它只是给我&#34; AM&#34;?

我在某处犯了一个愚蠢的错误,或者这里有什么东西超出了我对JavaScript内部运作的有限理解? i只是一个for循环变量。

5 个答案:

答案 0 :(得分:3)

(((i % 12) == 0) ? '12' : (i % 12)) + ' ' + (i < 12) ? 'AM' : 'PM'

因为之前的一切都是?被强制为布尔。

实际上前面的是字符串'9 true',它是与空格连接的第一个三元组中的9然后,因为(i <12)为真,但它在字符串上下文中(i&lt; ; 12)被强迫“真实”。

当强制转换为布尔值时,此字符串是真实的,因为它是非空的。

答案 1 :(得分:3)

问题是你认为你连接的部分实际上是后三元条件的一部分。具体来说,取第一个三元的后一部分,你的表达相当于

(i % 12) + ' ' + (i < 12) ? 'AM' : 'PM'`

条件部分(i % 12) + ' ' + (i < 12)评估为“9 true”,这是一个真实的结果。由于它是真实的,返回的结果是“AM”; “9”被评估为条件的一部分,而不是按照您的意图连接。

因此,解决方案是将最后一位分组以正确隔离三元结果:

((i < 12) ? 'AM' : 'PM')

更新的代码变为:

(i % 12 == 0 ? '12' : i % 12) + ' ' + (i < 12 ? 'AM' : 'PM')

答案 2 :(得分:1)

将第二个三元包装在括号中并且有效:

(((i % 12) == 0) ? '12' : (i % 12)) + ((i < 12) ? 'AM' : 'PM')

答案 3 :(得分:1)

这也有效:D

var a = (((i % 12) == 0) ? '12' : (i % 12));
var b = (i < 12) ? 'AM' : 'PM';
var output = a + b;

答案 4 :(得分:0)

试试这个。将括号放在您决定AM或PM的位置

var a = (((i % 12) == 0) ? '12' : (i % 12)) + ' ' + ((i < 12) ? 'AM' : 'PM');

这里是有效的jsfiddle http://jsfiddle.net/fLXr9/