这个javascript短路分配有什么问题

时间:2016-02-08 12:33:46

标签: javascript

以下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

请解释逻辑。

3 个答案:

答案 0 :(得分:1)

总之:operator precedence.

是,||短路并且不评估在三元运算符中用作条件的表达式的后半部分

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或使用适当的属性

替换