使用&&适用于Javascript中的条件

时间:2012-08-14 06:10:11

标签: javascript

我有这个:

var field = query("form#"+form.id+" input[name='" + error.field + "']");
if(field.length){
  if( field[0].id ) {
    widget = registry.byId( field[0].id );
    if(widget){
    ...
  }
 }

我原本以为我可以写:

var field = query("form#"+form.id+" input[name='" + error.field + "']");
if(field.length && field[0].id && widget = registry.byId( field[0].id) ){
...
}

但如果我使用第二个“缩短”形式,我会收到Javascript错误。

抱歉,给一个JSFiddle会很麻烦。当query()返回0值时会发生问题 - field[0].id&& widget = registry.byId( field[0].id)仍被解释。

我认为我正在玩它是安全的,因为第二个field[0].id只会在field.length> 0时发生,然后widget = registry.byId( field[0].id)只会在field[0].id时发生是真的......

我错过了什么?

Merc的。

2 个答案:

答案 0 :(得分:2)

问题是=运算符的优先级低于&&运算符,因此您的代码正在尝试获取结果:

field.length && field[0].id && widget

...并为其指定一个值。你可以通过在作业周围加上括号来解决这个问题:

if(field.length && field[0].id && (widget = registry.byId(field[0].id)) ){

(似乎在这个小演示中工作得很好:http://jsfiddle.net/nnnnnn/4dAfS/

进一步阅读:MDN's Operator Precedence article

答案 1 :(得分:1)

您可能会收到Uncaught ReferenceError: Invalid left-hand side in assignment错误,这是因为您尝试在右侧评估registry.byId()方法,并在左侧将其分配到result,但由于您没有限制左侧 - 使用括号进行手工分配,整个field.length && field[0].id && widget被认为是引发错误的。

您可以通过将最后一个条件包含在括号中来抑制错误。 if(field.length && field[0].id && (widget = registry.byId( field[0].id)) ){