【问题标题】:Console log with if, strange behaviour [duplicate]带有if的控制台日志,奇怪的行为[重复]
【发布时间】:2013-06-16 08:31:14
【问题描述】:

我正在尝试学习一些 javascript,但我不能完全回答为什么:

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

给我回'A'而不是示例:A。但是当我这样写时:

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

它完美无缺。这是否意味着第一个将“示例:”字符串与 this if 放在逻辑 + 中?

【问题讨论】:

    标签: javascript if-statement console.log


    【解决方案1】:

    这不是if 语句,它是一个三元运算符。

    但从根本上说,是的,首先要评估这部分:

    (a === 'xyz')
    

    ...变成true 或false。然后就完成了(假设true):

    'Example: ' + true
    

    ...导致:

    'Example: true'
    

    ...然后就完成了:

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

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

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

    【讨论】:

    • 相当完整的答案+1。
    • 很好的答案。第一行代码绝对正确。当使用 thr 三等号时,它正在评估一个布尔值。因此,它正在寻找(a === true) 或(a === false)。在这种情况下,应该使用==。
    • @Mic1780:无论哪种方式,结果都是布尔值。 == 只是添加类型强制。在 OP 的示例中,使用 == 和 === 之间没有任何区别,因为 a 和 'xyz' 都是字符串。 “因此,它正在寻找 (a === true) 或 (a === false)” 不,这种比较永远不会进行。
    • @Mic1780,不,=== 是正确的比较。但是,这并不重要,因为只要String 不是空字符串,String + true 和String + false 都为真。
    • @DerekHenderson 查了之后我明白你现在的意思了。 === 评估类型和值,因为 == 只评估值。我的错。
    【解决方案2】:

    没错,如您所见,+ 的优先级高于?

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

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

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

    【讨论】:

      【解决方案3】:

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

      即使相等性测试为假,它也会返回 A,因为与true 或false 连接的字符串仍然为真。

      【讨论】:

        猜你喜欢
        • 2020-03-09
        • 1970-01-01
        • 1970-01-01
        • 2020-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多