2014-05-07 34 views
0

我在我的JavaScript设置一个断点,我键入下面的表达式到Chrome浏览器控制台窗口:串连`:`条件字符串在JavaScript

类型的:

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

结果:

9 

类型的:

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

结果:

"AM" 

类型的:

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

结果:

"AM" 

我的期望是,最后的结果将是 “上午9点”,这是我想要的。如果我输入9 + "AM",那就是我得到的结果。为什么只给我“AM”?

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

+0

不恰当地使用条件运算符,还要检查truthy和falsey的值 - http://james.padolsey.com/javascript/truthy-falsey/ – adatapost

回答

1

裹在括号中的第二三元和它的工作原理:

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

试试这一个。把支架,你决定上午或下午

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

这里是工作 http://jsfiddle.net/fLXr9/

3

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

因为之前的所有的的jsfiddle?被强制为布尔值。

究竟去之前是字符串'9 true'这是从与空间连接起来的第一三字母9,然后,因为(我< 12)是真实的,但它是在一个字符串上下文(我< 12)被胁迫“真正'。

当强制为布尔值时,此字符串为真,因为它非空。

3

问题是你认为你连接的部分实际上是作为后一个三元条件的一部分。具体地,以所述第一三元的后面部分,您的表达式相当于

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

条件部分,(i % 12) + ' ' + (i < 12)评估为“9真”,这是一个truthy结果。因为它真的很好,所以返回的结果是“AM”; “9”将作为条件的一部分进行评估,而不是按照您的意图进行连接。

因此,解决的办法是基团的最后一个比特,以正确地隔离三元结果:

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

的更新的代码变为:

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

这也将工作:d

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