使用三元运算符解释操作顺序的Javascript

使用三元运算符解释操作顺序的Javascript,javascript,conditional-operator,Javascript,Conditional Operator,为什么我会在三元运算符结果上得到一个不应该命中的不可读取属性“name”null。我似乎不理解什么时候读什么时候读什么的逻辑和流程 这失败了 function log(msg) { console.log('something' + (log.caller != null) ? log.caller.name: ""+"->" + msg); } 这项工作(移动到自己的生产线) 然后我意识到了这一点(在整个三元逻辑中添加了括号) 但这也行得通(在

为什么我会在三元运算符结果上得到一个不应该命中的不可读取属性“name”null。我似乎不理解什么时候读什么时候读什么的逻辑和流程

这失败了

 function log(msg) {
            console.log('something' + (log.caller != null) ? log.caller.name: ""+"->" + msg);
        }
这项工作(移动到自己的生产线)

然后我意识到了这一点(在整个三元逻辑中添加了括号)

但这也行得通(在三元数之前删除字符串)

有趣的逻辑,工作。。。不知道!!会变成一个傻瓜。显然,严格的管理是行不通的。(不确定这是否是不好的做法)


没有问题,它将在“严格”模式下工作。
?:三元运算符的优先级很低,因此如果您不确定,安全的做法是将整件事括起来。
'something'+(log.caller!=null)?log.caller.name:“+”->“+msg
('something'+(log.caller!=null))相同?log.caller.name:“+”->“+msg
ahh。它可以翻译成这样。
没有什么错,它将在“严格”模式下工作。
?:三元运算符的优先级很低,因此如果您不确定,安全的做法是将整件事括起来。
'something'+(log.caller!=null)?log.caller.name:“+”->“+msg
('something'+(log.caller!=null))相同?log.caller.name:“+”->“+msg
ahh。也就是说。
function log(msg) {
            callerName = (log.caller != null) ? log.caller.name: "";
            console.log('something' + callerName +"->" + msg);
        }
    function log(msg) {        
        console.log('something' + ((log.caller != null) ? log.caller.name : "") +"->" + msg);
    }    
function log(msg) {       
        console.log((log.caller != null) ? log.caller.name : "" +"->" + msg);
    }
function log(msg) {       
        console.log('something' + (!!log.caller ? log.caller.name : "") +"->" + msg);
    }