控制台日志用if,奇怪的行为

时间:2013-06-19 17:22:23

标签: javascript if-statement console.log

我正在尝试使用一些javascript,但我无法回答原因:

var a = 'xyz';
console.log('Example: ' + (a === 'xyz') ? 'A' : 'B');

让我回到'A'而不是示例:A。然而,当我把整体放在那样的时候:

var a = 'xyz';
console.log('Example: ' + ((a === 'xyz') ? 'A' : 'B'));

它完美无瑕。这是否意味着第一个将'Example:'字符串放在逻辑+中,如果这个?

3 个答案:

答案 0 :(得分:7)

这不是if声明,而是三元运算符。

但从根本上说,是的,正在发生的事情是首先对这部分进行评估:

(a === 'xyz')

...并变为truefalse。然后就完成了(让我们假设true):

'Example: ' + true

...导致:

'Example: true'

......然后就完成了:

'Example: true' ? 'A' : 'B'

...这给了我们'A'因为字符串不是空白的,所以它很简洁。

这是因为+的优先级高于三元组(? :)。

答案 1 :(得分:3)

正如您所看到的,+的优先级高于?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence

因此,在您的第一个表达式中,首先执行布尔值(a === 'xyz')的字符串连接,然后将非空字符串计算为布尔值true,并将“A”作为最终输出。

在第二个表达式括号中强制?运算符在+之前执行。

答案 2 :(得分:1)

如果你没有用括号设置(a === 'xyz') ? 'A' : 'B',JS引擎优先于+运算符,并将你的真实测试解释为'Example: ' + (a === 'xyz'),从而返回A.

即使相等测试为假,也会返回A,因为与truefalse连接的字符串仍为真。