Подтвердить что ты не робот

Javascript array: почему это недействительно?

У меня есть следующий рабочий код:

var routes = [];

Eclipse validator для javascript печатает следующее предупреждение:

Type mismatch: cannot convert from any[] to any

Что не так с моим пустым массивом?

Изменить: предупреждение исчезло позже. По-видимому, Eclipse ошибался, и вопрос должен быть закрыт. Извините.

4b9b3361

Ответ 1

Ваш JavaScript действителен, проблема связана с плагином JSDT для Eclipse. В последней версии они вводили проверку типов, что во многих ситуациях проблематично - не только для пустых массивов (например, в вашем случае). Другой типичный случай может выглядеть так: a = b || c; Плагин будет жаловаться, когда b и c имеют разные типы (что является абсолютно допустимым кодом для JavaScript). Об этой проблеме уже сообщается разработчикам JSDT об ошибках, но проблемы еще не исправлены.

К сожалению, в настоящее время невозможно отключить проверку типа с помощью экрана конфигурации JSDT в Eclipse. Я отключил его непосредственно из исходного кода JSDT. Для этого выполните следующие действия:

  • Загрузите исходный код JSDT из Проект Eclipse WebTools
  • Откройте проект org.eclipse.wst.jsdt.debug.core с помощью Eclipse. Убедитесь, что у вас установлен Eclipse SDK. Также может потребоваться настроить некоторые зависимости в файле plugin.xml.
  • Проверка типа находится в computeSeverity методе класса ProblemReporter.
  • Чтобы отключить проверку типа, замените строку: case IProblem.TypeMismatch: return ProblemSeverities.Warning; на case IProblem.TypeMismatch: return ProblemSeverities.Ignore;
  • Создайте проект и закройте Eclipse.
  • В папке Eclipse найдите файл с именем org.eclipse.wst.jsdt.core<version>.jar - сделайте безопасную копию, затем откройте файл jar и замените файл ProblemReporter.class на тот, который вы скомпилировали на шаге 5 (файл находится в bin папку вашего проекта).
  • Запустите Eclipse и очистите свой проект JavaScript. Все проверки типов будут игнорироваться JSDT.

Внимание! Убедитесь, что вы загрузили ту же версию JSDT, которую вы используете в Eclipse. В конце концов вместо замены одного файла вы можете заменить весь плагин.

Если вы не хотите загружать и компилировать плагин самостоятельно, вы можете попробовать с моей установленной версией. Я разместил его на веб-странице FunctionSack. Я использую Eclipse 3.7 (Indigo) с JSDT 1.3.0, поэтому убедитесь, что у вас есть аналогичная конфигурация, если вы хотите использовать мой файл.

Ответ 2

Плагин платформы веб-инструментов eclipse (wtp) включает в себя проверку подлинности JavaScript, которая несколько аллергия на литералы литерала "{}" и "literal" [] ", также обнаруживает некоторые другие раздражающие" проблемы ", такие как" "точка с запятой" и т.д.

Я нашел лучшее решение для меня, и для моих нервов - полностью отключить встроенную проверку подлинности JavaScript и использовать сторонний подключаемый модуль. Удивительно, но это не так просто отключить JavaScript validator. Для каждой версии eclipse требуется другой подход, поэтому попробуйте следующее руководство:

  • В Eclipse до версии 3.6 можно было отключить javascript проверка через 'Window- > Настройки- > JavaScript- > Validator- > Ошибки/Предупреждения → [] Включить JavaScript-семантическую проверку "- но это не кажется работа в 3.7 Indigo см. ошибка затмения
  • В версии 3.7 Indigo try Project → Свойства → Строители → [] JavaScript Validator
  • Если это не помогает, попробуйте Project → Properties → JavaScript → Include Path → Source → Excluded → Edit → Шаблоны исключений → Изменить → */
  • Если ничего выше не помогает, откройте файл .project и удалите/закомментируйте "<nature> org.eclipse.wst.jsdt.core.jsNature </nature> " линия

После отключения валидатора wtp вы можете попробовать использовать сторонний инструмент, например jsLint/jsHint

Ответ 3

Как я уже отмечал в своем тестировании, проблема возникает, когда вы определяете локальную переменную в функции, тело которой следует за ключевым словом 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;
}

Ответ 4

Это действительный Javascript (если вы не пишете его в каком-то странном контексте, например, в середине выражения: P), так что либо "Eclipse validator for javascript" сломан, либо вы не используете "Eclipse validator for javascript".

Ответ 5

Это вполне допустимый JS и звучит так, как Eclipse может использовать неправильный плагин синтаксиса или что-то... ну... неправильно.

Вы можете подтвердить это, пытаясь...

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