以下javascript代码将undefined作为最终输出。但据我所知,OR' || '操作员将在评估完成后立即停止评估" true"。但是在这段代码中,它试图评估剩余的条件,即使它在第一个表达式上变为真。
field = {
ipaddr: "0.0.0.0",
nodePresentInTopo: false
}
var bestName = field.ipaddr || (field.ip6addr && field.ip6addr != '::') ? field.ip6addr : undefined || field.sysid;
这里bestName总是evalueavtes到undefined但是为什么?因为它在field.ipaddr得到的值,即0.0.0.0
请解释逻辑。
答案 0 :(得分:1)
是,||
短路并且不评估在三元运算符中用作条件的表达式的后半部分。
field.ipaddr || (field.ip6addr && field.ip6addr != '::') ? .. : ..
评估为:
'0.0.0.0' ? .. : ..
评估为true
,然后评估三元运算符的true
分支:
field.ip6addr
如果您想要不同的逻辑分组,请使用括号:
field.ipaddr || (.. ? .. : ..);
答案 1 :(得分:0)
我假设您已经写过field.ipaddr
而不是fields.ipaddr
。可能用于测试目的。如果表达式的最后一部分是您的问题,请按以下方式编写:
(undefined || fields.sysid);
答案 2 :(得分:0)
我不认为在当前对象中有任何名称为ip6addr
的属性吗?
var bestName = (field.ipaddr || (field.ip6addr && field.ip6addr != '::') ? field.ipaddr : undefined || field.sysid);
undefined
您应该在当前对象中添加ip6addr
或使用适当的属性