This question already has answers here:
Concatenate string with ternary operator in javascript
                                
                                    (2个答案)
                                
                        
                        
                            confusion with hasOwnProperty
                                
                                    (1个答案)
                                
                        
                3年前关闭。
            
        

我有一个未定义的变量,并在字符串concat中对其进行了检查:

var undefinedVariable = undefined;
console.log("foo" + undefinedVariable === undefined ? "bar" : undefinedVariable.toString() );


考虑到undefinedVariable是未定义的,因此undefinedVariable.toString()是无法访问的代码。但是,我收到此错误:


  未捕获的TypeError:无法读取未定义的属性“ toString”(…)


奇怪的是,如果我在console.log的开头删除了“ foo”,那么代码可以正常工作。

console.log(undefinedVariable === undefined ? "bar" : undefinedVariable.toString() );


我已经在chrome和firefox中进行了测试,得到的结果相同,因此可能不是错误。有什么解释为什么JS引擎试图运行不可达部分?

最佳答案

这是因为Operator Precedence+(连接运算符)的优先级比?:(三元运算符)大。因此,您需要将三元条件放在()内,因为它将三元条件与+(并置运算符)一起使用,而左侧不再是undefined。利用:

console.log("foo" + (undefinedVariable === undefined ? "bar" : undefinedVariable.toString()) );


您需要告诉JavaScript引擎分别评估undefinedVariable,并且不要同时加入"foo"undefinedVariable进行评估。



var undefinedVariable = undefined;
console.log("foo" + (undefinedVariable === undefined ? "bar" : undefinedVariable.toString()) );





上面给了我:foobar

javascript - 无法在JavaScript中正确编写三元运算符-LMLPHP

10-06 07:42