【问题标题】:Jslint error: Expected a conditional expression and instead saw an assignmentJslint 错误:需要一个条件表达式,而是看到一个赋值
【发布时间】:2012-09-02 21:39:50
【问题描述】:

对于此代码:

var i = 0;
for (i < menuitem.length; i += 1;)

JSlint 返回:

需要一个条件表达式,但看到的是一个赋值。

需要一个标识符,但看到的是 ')'。

并拒绝继续扫描。 此代码工作正常,但有什么问题?我怎么能用“if”语句来写这个? (如果这就是 jslint 的意思)。

感谢你们的帮助!

【问题讨论】:

  • 我不确定您的 for 循环是如何工作的。看起来这将是一个无限循环。
  • @minitech 它通过菜单项列表运行。那应该怎么写呢?
  • 你的 for 循环是一个无限循环。 JSlint 是正确的警告你。我想你打算写的是:for (;i &lt; menuitem.length; i += 1)。 (查看我移动分号的位置)。当然更正确的循环是:for (var i=0; i &lt; menuitem.length; i += 1)

标签: javascript jslint


【解决方案1】:

是的,JSLint 非常恶毒。正如其他人指出的那样,您没有在正确的位置填写内容,但除此之外,JSLint 要求您将 something 放入 for 循环的初始化部分。不过,有几个选项可以让它在不影响逻辑的情况下发挥得很好。我最喜欢的是重置i(即使它已经设置好了):

var i = 0;
for (i = 0; i < menuitem.length; i += 1) {
    /** do stuff **/
}

这使 JSLint 很高兴,并且如果您决定将其用于同一词法范围内的另一个 for 循环,也可以确保 i 被重置。另一种选择是在其中扔一个null 来填充空间(如果您不想重置i 的值):

var i = 0;
for (null; i < menuitem.length; i += 1) {
    /** do stuff **/
}

两者都可以正常工作并安抚令人担忧的 JSLint。但是,没有人会真正关心您是否将初始化部分留空(除了 JSLint)。你可以试试 JSHint,因为它对这类事情更宽容。

【讨论】:

  • 没有点设置i=0 这样连续两次。在我看来,如果i 存在是一个for 循环计数器,那么它的初始值是for 循环实现的逻辑的一部分,因此它应该在没有初始值的情况下声明为var i;,然后在其中初始化forfor(i=0; ...。 (这也应该通过 JSLint。)
  • 同意,@nnnnnn。当我在这种情况下声明 i 时,我通常不会初始化它。但是,OP 可能只发布了他的代码的相关部分,并且之前使用了 i。这不太可能,但有可能。没有必要追究他,只是因为没有包含一些代码而被告知我错了。 :-)
  • 是的,很酷。顺便说一句,我并不是要“追捕”你。
【解决方案2】:

你的for 循环有点奇怪,第二部分应该是循环的条件,而不是你有一个赋值。

您必须始终按顺序订购零件(initialisation; condition; step)

var i = 0;
for (; i < menuitem.length; i += 1)

我刚刚将您的分号从末尾移到了开头。或者,您可以根据需要将变量声明和赋值放在第一部分中。

【讨论】:

  • 不幸的是似乎没有通过验证:(
  • @SnippetSpace 验证消息是否更改?是不是说的一样?
  • @SnippetSpace:要通过验证,它必须是:for (var i=0; i &lt; menuitem.length; i += 1)。上面的代码仍然比您的原始代码更好,因为即使它没有通过验证,至少它可以工作,而您的原始代码显然是一个错误。
  • @SnippetSpace:我真的不认为原始代码的工作方式与您认为的那样,因为测试条件在原始代码中始终为真,至少在我回滚到 0 之前(做数字在javascript中翻转?)
  • @slebetman:不,数字不会在 JavaScript 中翻转。他们变成Infinity。很长一段时间后,从0开始……
【解决方案3】:
for (var i = 0; i < menuitem.length; i += 1) {
  // code
}

或者

var i = 0;

for (; i < menuitem.length; i += 1) {
  // code
}

【讨论】:

  • 两者似乎都没有通过验证:(
  • 加载。但想通了,看看我的回复。
【解决方案4】:

找到了!以下是验证的准确答案:

var i;
for (i = 0; i < menuitem.length; i += 1) {
  // code
}

var 应该在外面说 jslint :s

【讨论】:

  • 不,虽然它可能是 JSLint 不喜欢的其他东西。它抱怨的是赋值 i += 1 出现在预期条件的位置,可能是 i &lt; menuitem.length
【解决方案5】:

根据您的代码 sn-p,我将假设 i 只是一个用于控制循环周期数的变量。正确的代码是

for (var i = 0; i < menuitem.length; i += 1) {
// code
}

这就是标准化的声明和语法——至少对于我现在能想到的语言来说是这样。这就是这种循环的真正意义——for循环是这样设计的,所以作者可以简单地编写一行代码,而不是如果他/她想做一个while循环的话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2023-03-26
    • 2021-01-09
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多