我的代码中有几个地方需要迭代字符串并通过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循环而不必生成多余的数组来执行基本的迭代?
答案 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。