【发布时间】:2013-07-14 01:04:47
【问题描述】:
我写了一个非常简单的循环来查找点 '.' 的位置。和字符串中的空格,然后对其进行切片并将它们推入数组中。循环必须在找到最后一个点时结束。我想我犯了一个错误,因为循环没有正确退出引号,并且我得到了双重输出。
代码如下:
var str = '.boom .style #foo .media';
var p = 0;
var className = [];
searchLoop: for(i = 0; i < str.length; i ++) {
var n = str.indexOf('.', p);
var o = str.indexOf('#');
var p = str.indexOf(' ', n) ;
if(str.indexOf('#') >= 0)
var idName = str.slice(o + 1, n);
if(str.lastIndexOf('.') !== n)
className.push(str.slice(n + 1, p));
console.log(className);
console.log(idName);
if(str.lastIndexOf('.') === n) {
className.push(str.slice(n + 1, p) + str[str.length - 1]);
break searchLoop;
}
}
这是输出:
["boom", "style", "media"]
["boom", "style", "media"]
["boom", "style", "media"]
foo
我稍微编辑了代码,所以它也可以选择“#”,这次我得到了三倍的结果。
【问题讨论】:
-
您自己实施这个有什么原因吗?不要在生产代码中重新发明轮子!使用
String.split()!重新实现使代码容易出错;使用久经考验的方法。不要依赖新的实现;可能存在可能破坏您的代码的边缘情况,标准版本针对性能进行了优化并由专业程序员编写。在像 JS 这样的解释型语言中,最好直接访问解释器。内置的.split()方法可以做到这一点。 -
您可以将正则表达式与拆分
str.split(/[.#]/)... -
您的循环正在正确退出。这只是一些时髦的控制台行为,会延迟对数组的评估。将其更改为
console.log(className.slice()),您会看到不同。如果您登录i,也很有帮助。您会看到有三个迭代。 -
看起来您确实在尝试解析 CSS...无论如何,我仍然建议使用正则表达式,因为您正在使用模式,它是完美的工具。您可以与
/([.#])(\w+)/匹配并将捕获组分成一组对象,例如[{type:'.',text:'boom'},{type:'#',text:'foo'},...] -
@CrazyTrain 你是对的,这只是一个时髦的控制台行为,它只迭代了 3 次。
标签: javascript loops break