2016-04-24 7 views
0

Что, по-видимому, заставляет многих читателей Java беспокоиться о JS, это его «классный папа»; вам все равно, если вы курите горшок или пообщаетесь с друзьями до 2 утра. Без этой структуры невозможно проверить безопасность типа в «время компиляции» ... или это так?JS - могут ли ошибки уловить лог?

Конечно, у javascript есть типы, но он не сильно типизирован. Это, как говорится, человек читает следующий отрывок заметит, что это собирается бросить исключение во время выполнения:

function f(anArray) { 
    "use strict"; 
    anArray.push("hi"); 
} 
f(5); //runtime exception for sure 

Мы можем видеть это как программисты, потому что, даже если типы не объявлены явно (например, INT с ;), мы можем собрать различные другие характеристики, чтобы вывести его тип (это число без кавычек). Похоже, что есть алгоритм (например, дерево решений), который может легко определить тип данного объекта.

Суть в том, что в динамически типизированном языке существуют типы, но их использование и преобразования неявные. Таким образом, мой вопрос заключается в следующем:

Допустимо ли, что литеры могли использовать неявные соглашения, чтобы определить, что такое тип объекта, и предупредить о возможной ошибке выполнения во время «времени»?

Благодарим вас заблаговременно.

+1

Существуют теги typecheckers для javascript, которые могут поймать эту ошибку, да, но они являются typecheckers not linters. – Bergi

+0

Как вы можете узнать, нет ли метода 'Number.prototype.push' во время выполнения? :-P – Bergi

+0

Ха-ха, звучит как ответ на меня. Наверное, меня смутило семантическое значение линта. –

ответ

1

Инспекторы кода, такие как литеры или контролеры типов, могут «идти» далеко не только при анализе кода на несовместимость типов точек.

Рассмотрим, например, этот код:

function f(a) { 
 
    return a%2 ? [a] : false; 
 
} 
 
x = []; 
 
for (var i=1; i < 10; i+=2) { 
 
    x = f(i).concat(x); 
 
} 
 
document.write(x);

Это не будет проблемой; но было бы, если бы i началось с 2 вместо 1. В общем случае значение, переданное в f, могло быть результатом сложного алгоритма, и инспектору кода пришлось бы фактически запустить код, чтобы узнать результат , Это, конечно, не идея такого инструмента, и поэтому на практике можно найти тривиальные случаи несовместимости типов.

1

Я бы посоветовал вам взглянуть на Tern, вы можете установить его в свой текстовый редактор (или просто запустить его как исполняемый файл), и он попытается определить тип переменной в определенной области и предлагает такие инструменты, как завершение кода, предложения методов (основанные на определенном типе), подсказки аргументов функции и т. д. Это не идеально, но работает очень хорошо, основываясь на ограничениях JavaScript.

Смежные вопросы