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

Unable to correctly write ternary operator in JavaScript

我有一个未定义的变量,我在字符串连接中检查它:

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

考虑到undefinedVariable是未定义的,undefinedVariable.toString()是一个不可到达的代码。但是,我收到此错误:

Uncaught TypeError: Cannot read property 'toString' of undefined(…)

奇怪的是,如果我在 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.