我在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
循环变量。
答案 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/