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

时间:2016-06-07 17:33:43

标签: javascript javascript-engine

我有一个未定义的变量,我在字符串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中测试过,我得到了相同的结果,所以可能它不是一个bug。有没有解释为什么JS引擎试图运行无法访问的部分?

1 个答案:

答案 0 :(得分:3)

这是因为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

Output