2

coffee- 生成以下简单代码片段的 JS:

console.log 'b' if 'b' in arr

var __indexOf = [].indexOf || function(item) {
    for (var i = 0, l = this.length; i < l; i++) {
        if (i in this && this[i] === item) return i;
    } return -1;
};

if (__indexOf.call(arr, 'b') >= 0) {
  console.log('b');
}

我能理解为什么会这样。IE 不支持indexOf,我们希望确保我们的 CS 代码在所有浏览器上都能流畅运行。但是,在为 Node.js 服务器编写代码时,我们确切地知道 JS 引擎支持什么(ECMA-262,第 5 版),因此我们不需要上述技巧。

我对不同的 JavaScript 实现并不十分熟悉,但我确信这不是coffee -c由于浏览器不兼容而产生的唯一非最佳代码,如果我们在具有数千个并发连接的生产服务器中考虑所有这些代码,它们会添加一个大量不必要的代码开销。

有没有办法解决这个问题?这些天越来越多的 Node.js 代码是用 CS 编写的,而且随着 SourceMap 的出现,这个数字会更大......

4

1 回答 1

3

这几乎不是最佳的。声明在__indexOf开始时被评估一次,然后立即解析为[].indexOf,即使用底层实现的Array.prototype.indexOf. 当然,这并不是一笔巨大的开支。

我需要查看其他一些“非最佳”代码示例,但我确信它们中的大多数都属于同一个篮子。并发连接的数量根本不会影响此效果。

于 2012-05-27T12:12:33.843 回答