JavaScript:期望赋值或函数调用,但看到的是表达式。

4
我正在使用JSHint来确保我的JavaScript是“严格”的,但我遇到了以下错误: 期望是赋值或函数调用,却看到了表达式 这个错误在以下代码上出现:
      var str = 'A=B|C=D'
      var data = {};
      var strArr = str.split( '|' );
      for (var i = 0; i < strArr.length; i++) {
          var a = strArr[i].split('=');
          a[1] && (data[a[0].toLowerCase()] = a[1]);  // Warning from JSHint
      } 

任何想法,为什么我会得到这样的错误或者我怎么编码才能消除这个错误。

你试图用最后一行做什么? - attila
2
在我看来,你正在赋值 (data[a[0].toLowerCase()] = a[1]) 而不是比较 (data[a[0].toLowerCase()] == a[1]) - Adelin
该代码正在尝试解析字符串并将其转换为对象。例如'ABC=XYZ'。预期的结果是data.abc = xyz。 - HSG
1
最后一行看起来有点混乱,无论如何你都可以重新更清晰地写出它。 - Evan Trimboli
2个回答

5

这里有一个简化版本,它给出了相同的警告:

var a, b;
a && (b = a);

预期是一个赋值或函数调用,而实际上却是一个表达式

这意味着你有一个表达式,但没有将结果分配给任何变量。jshint不关心实际表达式是什么或是否存在副作用。即使你在表达式内部分配了某些东西,你仍然忽略了表达式的结果。

如果你关心的话,jslint还有另一个错误:

意外的赋值表达式

这会提醒你在逻辑表达式中可能想要使用==而不是=。这是一个常见的错误,因此你被劝阻在逻辑表达式中使用赋值(尽管这正是你想要的)。

基本上,jshint/jslint不喜欢滥用逻辑运算符的快捷求值作为if语句的替代品。它假设如果表达式的结果没有被使用,那么它可能不应该是一个表达式。


感谢。我将左侧拆分到单独的一行以进行if语句内的比较和赋值。 如果 (a[1] !== null ) { dataObj[a[0].toLowerCase()] = a[1]; } - HSG

1

http://jshint.com/docs/options/#expr - JSHINT表示,Expr警告是放宽选项的一部分。因此,如果您编写/* jshint expr: true */,它将不会给出警告。但是,您还必须了解函数的范围。如果您只在所有内容的顶部键入此行,则将全局应用此规则。因此,即使您在其他行上犯了错误,jshint也会忽略它。因此,请确保明智地使用它。尝试仅在特定函数中使用(我的意思是仅在一个函数内部)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接