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

Concatenate `?:` Conditional Strings in JavaScript

本文关键字:JavaScript 条件 字符串 连接      更新时间:2023-09-26

我在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"

我的期望是,最后的结果将是"9AM",这是我想要的。这是我输入9 + "AM"得到的结果。为什么它只给我一个"AM"?

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

将第二个三进制用圆括号括起来就行了:

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

问题是您认为要连接的部分实际上是后一个三元条件的一部分。具体来说,取第一个三元数的后半部分,表达式等价于

(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')

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

因为在?被强制为布尔值。

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

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

也可以:D

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

试试这个。在决定AM或PM的地方加上括号

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

是可以工作的jsfilehttp://jsfiddle.net/fLXr9/