什么是Javascript相当于C ++的#define?

时间:2015-10-15 22:39:56

标签: javascript c++

JS中的每个循环都是"危险的"在阵列上使用,我不能简单地做

for (var idx in arr)

而是必须做

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

输入非常费力。假设输入需要3秒钟,我必须在生命中输入10,000次......

3s x 10,000 / 60h = 500h

500h * $ 28 / h = $ 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)
{
   // ... 
}

这可能吗?

4 个答案:

答案 0 :(得分:6)

Javascript没有像C / C ++这样的预处理器,因此在Javascript中没有直接等同于C#的#define。

该语言中唯一的伪替换是使用实际函数而不是在运行时执行的预处理器扩展,而不是在解析/编译时执行。

所以,你的选择是:

  1. 使用每个人都知道并理解的常规 (a) | (a) | (cmd1) | (cmd1) | (cmd2) | (cmd2) assoc.cmd_id | assoc.sub_id | command.id | command.command | command.id | command.command ---------------------------------------------------------------------------------------- 1 | 2 | 1 | CREATE | 1 | CREATE 1 | 2 | 1 | CREATE | 2 | USE 1 | 2 | 1 | CREATE | 3 | DESTROY ... 循环。
  2. 使用 function getdatatableajax() { if($this->input->get('search_term')) { $search_term = $this->input->get('search_term'); } else { $search_term = false;} $this->load->library('datatables'); $this->datatables ->select("sales.id as sid, date, reference_no, biller_name, customer_name, total_tax, total_tax2, total, internal_note") ->from('sales') ->join(deliveries, 'sales.reference_no = deliveries.reference_no', 'left'); $this->datatables->add_column("Actions", "<center><a href='#' title='$2' class='tip' data-html='true'><i class='icon-folder-close'></i></a> <a href='#' onClick=\"MyWindow=window.open('index.php?module=sales&view=view_invoice&id=$1', 'MyWindow','toolbar=0,location=0,directories=0,status=0,menubar=yes,scrollbars=yes,resizable=yes,width=1000,height=600'); return false;\" title='".$this->lang->line("view_invoice")."' class='tip'><i class='icon-fullscreen'></i></a> <a href='index.php?module=sales&view=add_delivery&id=$1' title='".$this->lang->line("add_delivery_order")."' class='tip'><i class='icon-road'></i></a> <a href='index.php?module=sales&view=pdf&id=$1' title='".$this->lang->line("download_pdf")."' class='tip'><i class='icon-file'></i></a> <a href='index.php?module=sales&view=email_invoice&id=$1' title='".$this->lang->line("email_invoice")."' class='tip'><i class='icon-envelope'></i></a> </center>", "sid, internal_note") ->unset_column('sid') ->unset_column('internal_note'); echo $this->datatables->generate(); } ,内置数组迭代器
  3. 创建将执行迭代的您自己的函数(当for (var i = 0; i < arr.length; i++)已存在时,没有实际意义。)
  4. 使用 .forEach() 中的ES6 of。您可以直接在ES6支持的环境中使用它,也可以使用像Babel这样的转换器。
  5. 在构建系统中使用预处理步骤,这样您就可以实际为JS文件添加预处理,并使用#define。
  6. 安全建议是使用.forEach()并在需要IE9之前的IE版本时添加polyfill,或者使用ES6 / transpiler选项(还有许多其他好处)。

答案 1 :(得分: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.

  4. 但是和许多评论一样,这样做可能会导致混淆并浪费更多时间让其他人在将来阅读您的代码。

答案 2 :(得分:0)

在C中:

   #define max(a,b) (a>b ? a : b)
   to use it:
   int result = max(2,3);

在JS中:

   let max = (a,b) => a>b ? a : b; 
   so use it:
   let result = max(2,3);

答案 3 :(得分:-2)

不一样,但您可以定义自己的功能:

$('#input').datetimepicker(
  'dateFormat': "yy-mm-dd",
  'timeFormat': "HH:mm:ss"
);

因此您可以按照以下方式使用它:

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

第二个参数是要在每个元素上应用的函数。 除了我使用的长名称之外,输入的速度比上面的myFor(myArr, myForEachFn); 循环更快。