我有一个未定义的变量,我在字符串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引擎试图运行无法访问的部分?
答案 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
。