7

我的代码中有几个地方需要遍历字符串并逐个字符地执行操作。我的 node.js 应用程序需要为每个请求执行数十次,而且字符串的长度通常会相当长。

我见过的将像下面这样的javascript转换为coffeescript的唯一方法是根据字符串的长度创建一个数组。我遇到的问题是它在硬件方面是一件额外的事情,占用额外的内存,而且似乎没有必要(我的节点应用程序处理 dgram - 每秒高达数千 - 所以所有这些额外的工作加起来)。

JavaScript 方式:

for(var i = 0; i < str.length; i++) { /* Do stuff with str here */ }

建议的 CoffeeScript 方式

for i in [0..str.length]
  # Do stuff here

同样,我认为当传统的 for 循环不必从硬件角度搞乱该步骤时,强制创建数组对象是愚蠢的。

我发现的唯一解决方法是使用 while 循环,例如:

i = 0
while i < str.length
  # Do stuff
  i++

虽然这样可行,但它甚至比直接使用简单 for 循环的 JavaScript 方式要冗长得多。

有没有办法在 CoffeeScript 中使用 for 循环,而不必生成多余的数组来执行基本迭代?

4

3 回答 3

13

如果不需要,它实际上不会创建数组。查看编译好的 JS。这个咖啡脚本:

str = "hello"
for i in [0..(str.length-1)]
  alert(i)

生成以下 JavaScript:

var i, str, _i, _ref;

str = "hello";

for (i = _i = 0, _ref = str.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
  alert(i);
}

实际上没有创建数组。

(将 1 减去 .length 以避免未定义)

于 2012-12-05T15:20:12.763 回答
7

您还可以遍历字符串本身:

for ch, i in str
  # Do stuff here.
于 2012-12-05T16:01:10.200 回答
2

在 JavaScript(因此,CoffeeScript)中,strings可以像访问一样访问arrays

console.log("Hello world".length);       // returns "11"
console.log("Hello world"[6]);           // returns "o"
console.log("Hello world".indexOf("w")); // returns "6"

我没有看到您在任何这些循环中初始化数组。

不过,如果这样可以解决问题,您应该能够在 CoffeeScript 文件中使用纯 JavaScript。

于 2012-12-05T15:17:24.933 回答