-1

我有这个:

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 是真的......

我错过了什么?

默克。

4

2 回答 2

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 的运算符优先级文章

于 2012-08-14T06:48:06.963 回答
1

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

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

于 2012-08-14T06:36:36.193 回答