迭代coffeescript中的字符串而无需创建数组

时间:2012-12-05 15:10:31

标签: javascript coffeescript

我的代码中有几个地方需要迭代字符串并通过char执行char操作。我的node.js应用程序需要每次请求执行此操作数十次,并且通常字符串的长度可能相当长。

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

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循环而不必生成多余的数组来执行基本的迭代?

3 个答案:

答案 0 :(得分:13)

如果没有,它实际上不会创建数组。看看编译好的JS。这个CoffeeScript:

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以避免未定义)

答案 1 :(得分:5)

您也可以迭代字符串本身:

for ch, i in str
  # Do stuff here.

答案 2 :(得分: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。