2015-10-15 3 views
-1

Для каждого-петель в JS «опасны» для использования в массивах, и я не могу просто сделатьЧто такое Javascript, эквивалентный #define на C++?

for (var idx in arr) 

и вместо этого должны сделать

for (var idx = 0, len = arr.length; idx < len; ++idx) 

, который является очень трудоемким типа. Предположим, что это занимает 3 секунды, чтобы набрать, и я должен ввести его в 10000 раз в моей жизни ...

3s х 10000/60h = 500h

500h * $ 28/час = $ 14 000

Было бы лучше иметь компактный способ создания этой общей строки кода. Было бы хорошо иметь некоторую директиву препроцессора как

#define L(arr,idx,len) for (var idx = 0, len = arr.length; idx < len; ++idx) 

и тогда я мог бы написать такие вещи, как

var myArray = [1, 69, 193912]; 
L(myArray,k,n) 
{ 
    // ... 
} 

Возможно ли это?

+0

Как насчет http://www.nongnu.org/espresso/js-cpp.html –

+4

'arr.forEach (function (el, i) {...})' – undefined

+0

На самом деле вы можете , Просто сделайте это и передайте его препроцессору c. –

ответ

6

Javascript не имеет препроцессора, такого как C/C++, поэтому нет прямого эквивалента #define C в Javascript.

Единственная псевдозамена, которая встроена в язык, заключается в использовании фактической функции, а не в расширении препроцессора, которая выполняется во время выполнения, а не во время разбора/компиляции.

Итак, ваши варианты:

  1. Используйте регулярные for (var i = 0; i < arr.length; i++) цикл, который все знает и понимает.
  2. Использование .forEach(), встроенный в массиве итератор
  3. Создать своей собственной функции, которая будет делать итерацию (нет реальной точки, когда .forEach() уже есть).
  4. Использовать ES6 of как в for (let i of arr). Вы можете использовать это непосредственно в среде, поддерживаемой ES6, или использовать транспилер, например, Babel.
  5. Используйте шаг предварительной обработки в вашей системе сборки, чтобы вы могли фактически добавить предварительную обработку в свои JS-файлы и иметь что-то вроде #define.

Безопасная рекомендация будет использовать .forEach() и добавить polyfill если версии IE до IE9 требуется или идти с параметром/transpiler ES6 (который имеет много других преимуществ тоже).

-2

Не совсем то же самое, но вы можете определить свою собственную функцию, как, что один:

function myFor(arr, fn) { 
    for(var i = 0; I < arr.length; i++) { 
     fn(i, arr[i]); 
    } 
} 

Таким образом, вы можете использовать его как следует:

myFor(myArr, myForEachFn); 

Если второй аргумент является функцией вы хотите применить к каждому элементу. Помимо длинных имен, которые я использовал, это быстрее, чем цикл for выше.

+4

Javascript имеет встроенную функцию 'forEach()', которая делает то же самое. Зачем определять свои собственные? – Barmar

+0

Ибо он попросил эквивалент '# define', и я привел ему пример. – skypjack

+0

@ Barmar Я имею в виду, в чем вопрос? Эффективный способ сделать «forEach» или как напечатать меньше, используя что-то вроде определения? Для меня это выглядело как второе, вероятно, не то же самое для вас ... :-) – skypjack

0

C и C++ - это скомпилированные языки, а #define - это макропроцессор предварительного процессора, который используется препроцессором для помощи в компиляции для конкретной компиляции платформы.

Насколько я знаю, нет библиотек, которые решают вашу проблему на JavaScript, но вы можете проверить npmjs.org, потому что я могу ошибаться.

Тем не менее, у меня есть три идеи для вас:

  1. Пишущие свой собственный препроцессор по своему вкусу, а затем просто использовать его как часть вашего телосложения нормальный JS построить рутину. Затем загрузите его в npm и станьте знаменитым
  2. Используйте препроцессор Gcc без компилятора: gcc-E path/to/file и направляйте его вывод в файл, который также может быть частью вашей js-сборки. Нелепый пример:

    #define FOR(s,end) for(i=s;i<=end;i++) 
    #define P console.log 
    #define func function 
    
    
    
    func add(a,x){ 
    
        P(a+x) 
    
    } 
    
    FOR(1,10){ 
    
        add(i,i) 
    } 
    
  3. Напишите свои собственные функции, чтобы облегчить жизнь. Вместо использования синтаксиса цикла напишите такие функции, как loop(start, finish, callback). Но даже это то же самое количество письма. Я хотел бы посмотреть на варианты 1 и 2.

Но, как и многие из комментариев, делая это Js может привести к путанице и тратить гораздо больше времени для других чтения кода в будущем.

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