Javascript数组:为什么这不起作用?

时间:2011-04-23 18:07:35

标签: javascript arrays

我有以下工作代码:

var routes = [];

javascript的Eclipse验证程序打印以下警告:

Type mismatch: cannot convert from any[] to any

我的空数组出了什么问题?

修改:警告稍后消失。显然Eclipse错了,问题需要关闭。对不起。

5 个答案:

答案 0 :(得分:39)

您的JavaScript有效,问题在于Eclipse的JSDT插件。在最新版本中,他们引入了类型验证,这在许多情况下都存在问题 - 不仅适用于空数组(如您的情况)。另一个典型案例可能如下所示:a = b || c; 当b和c属于不同类型时(这是JavaScript的绝对有效代码),插件会抱怨。已经向JSDT开发人员报告了有关此问题的几个错误,但问题尚未解决。

不幸的是,目前无法使用Eclipse中的JSDT配置屏幕关闭类型验证。我直接从JSDT源代码中关闭它。为此,请按以下步骤操作:

  1. Eclipse WebTools Project
  2. 下载JSDT源代码
  3. 使用Eclipse打开org.eclipse.wst.jsdt.debug.core项目。确保安装了Eclipse SDK。可能还需要调整plugin.xml文件中的某些依赖项。
  4. 类型验证位于computeSeverity类的ProblemReporter方法中。
  5. 要关闭类型验证,请将case IProblem.TypeMismatch: return ProblemSeverities.Warning;替换为case IProblem.TypeMismatch: return ProblemSeverities.Ignore;
  6. 构建项目并关闭Eclipse。
  7. 在Eclipse文件夹中找到名为org.eclipse.wst.jsdt.core<version>.jar的文件 - 制作一份安全副本,然后打开jar文件并将ProblemReporter.class文件替换为您在步骤5中编译的文件(文件为在项目的bin文件夹中。)
  8. 启动Eclipse并清理JavaScript项目。 JSDT将忽略所有类型检查。
  9. 重要!确保您已下载了在Eclipse中使用的相同版本的JSDT。最终,您可以替换整个插件,而不是替换单个文件。

    如果您不想自己下载和编译插件,可以尝试使用我的固定版本。我已将其放在我的FunctionSack网页上。我正在使用Eclipse 3.7(Indigo)和JSDT 1.3.0,所以如果你想使用我的文件,请确保你有类似的配置。

答案 1 :(得分:11)

eclipse的网络工具平台插件(wtp)包含一个JavaScript验证器,它对对象文字“{}”和数组文字“[]”符号有点过敏,它还会显示一些其他恼人的'问题',如'缺少分号'等。

我找到了最适合我的解决方案,我的神经是完全禁用wtp嵌入式JavaScript验证并使用第三方插件。 令人惊讶的是,禁用JavaScript验证器并不容易。每个eclipse版本都需要不同的方法,因此请尝试以下指南:

  • 在版本3.6之前的Eclipse中,可以禁用javascript 验证通过 'Window-&gt;偏好设置 - &gt; JavaScript-&gt; Validator-&gt;错误/警告 - &gt; [] 启用JavaScript语义验证“ - 但似乎没有 在3.7 Indigo中工作,请参阅eclipse bug
  • 在3.7 Indigo尝试项目 - &gt;属性 - &gt;建设者 - &gt; [] JavaScript Validator
  • 如果没有帮助,请尝试项目 - &gt;属性 - &gt; JavaScript - &gt;包含路径 - &gt;来源 - &gt;排除 - &gt;编辑 - &gt;排除模式 - &gt;编辑 - &gt; * /
  • 如果上述任何内容无效,请打开.project文件并删除/注释掉“&lt; nature&gt; org.eclipse.wst.jsdt.core.jsNature&lt; / nature&gt;”线

禁用wtp验证程序后,您可以尝试使用第三方工具,例如jsLint/jsHint

答案 2 :(得分:4)

正如我在目前的测试中观察到的那样,当您在一个函数中定义一个局部变量时会出现问题,该函数是一个跟随return关键字的主体。此方案可以在以下示例中显示(假设代码位于顶级JavaScript文件中,表示不在任何模块/函数内,因此第一个a在全局范围内定义):

var a=[]; //Global variable assignment, no warnings

function f1(){ //global function
    var a=[]; //level 1 local variable, no warnings
    return a;
}

function f2(){ //local functions and member functions
    var f = function(){
        var a=[]; // no warinings
        return a;
    };
    this.f = function(){
        var a=[]; //no warnings
        return a;
    };
    return f; //returning a defined funciton is OK
}

function f3(){ //returning a function
    return function(){
        var a=[]; //warning: Type mismatch: cannot convert from any[] to any
        return a;
    };
}

因此解决方法很简单:将f3更改为

function f3(){ //returning a defined function
    var f = function(){
        var a=[]; //warning is gone!
        return a;
    };
    return f;
}

答案 3 :(得分:2)

它是有效的Javascript(假设你不是在一些像表达式中间的某些奇怪的上下文中写的那样:P)所以要么“Eclipse的验证器”被破坏,要么你没有使用“Eclipse验证器” javascript“毕竟。

答案 4 :(得分:0)

这是完全有效的JS,听起来像Eclipse可能正在使用不正确的语法插件,或者某些东西......好吧......错了。

您可以尝试...

来确认
var routes = [];
routes.push({ url: '/' });
console.log(routes.length);