【问题标题】:Is there a reason to not assign a variable in the while block declaration? [duplicate]是否有理由不在 while 块声明中分配变量? [复制]
【发布时间】:2015-02-10 20:18:44
【问题描述】:

每当我做这样的事情......

var obj;

while (obj = doSomething()) {
  // something with obj
}

JSHint 告诉我warning 84| Expected a conditional expression and instead saw an assignment.。但是,obj = doSomething() 会返回 doSomething() 在赋值期间返回的值,因此以这种方式编写 while 循环是有意义的。

JSHint 警告我是否有特定原因,更重要的是,是否有理由不这样做?或者我可以告诉 JSHint 忽略该特定警告的那些行吗?

【问题讨论】:

  • 你也可以使用for (var obj = doSomething(); obj; obj = doSomething())
  • @Bergi 乍一看,这看起来像是一个古怪的 for 循环,使用 while 对我来说似乎更容易阅读。
  • 另见stackoverflow.com/questions/8108184/…。顺便说一句,这不是“while 块 声明”,而是“while [block] 条件”。
  • @Bergi 这很有趣——但没想到会以这种方式使用 for 循环。
  • @torazaburo 当你说它是那个问题的重复时,我认为你不理解我的问题,因为它和这个问题正在讨论相似但不同的事情。那个,或者你只是决定找到一个模糊相似的问题并说它可能是重复的......

标签: javascript node.js


【解决方案1】:

该警告是为了确保您没有输入错误的 = 而不是 =====

相反,您可以获得评估结果的布尔值,如下所示

while (!!(obj = doSomething())) {

【讨论】:

  • 啊,谢谢!我希望我可以只使用我的原始语法而不会触发错误,但这是一个很好的折衷方案,不使用 JSHint 特定的 cmets。
  • 其实你不需要!!;额外的一组括号足以关闭 jshint。
【解决方案2】:

单个= 赋值并且不是比较运算符。使用以下内容:

while (obj == doSomething()) {
  // something with obj
}

参考:http://www.w3schools.com/js/js_comparisons.asp

【讨论】:

  • 看来你不明白这个问题,OP很清楚其中的区别。他们故意使用=
  • 哦,好吧..那不会导致无限循环吗? (我假设另一种情况会分配值并将布尔值始终评估为真)
  • 实际上,这个答案很好地说明了为什么这是一个坏主意 - 它可能被误解为无意。
  • @Playmaker: 如果 a) 在正文某处有 break 语句或 b) doSomething() 为每个调用返回不同的值,并且可能在没有更多结果时返回 null,则不会.
  • 哦。这就解释了。也许我将来某个时候会使用它:D
猜你喜欢
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多