[英]Iterating over array of strings produces error
我传入了一系列错误消息以进行解析。 输入示例为:
"An item with this x Id already exists.
An item with this y id already exists.
An item with this barcode already exists.
"
也就是说,字符串实际上是上面的每行之间用\\ n分隔,最后是\\ n。
function( msg )
{
alert( "\"" + msg + "\"" );
var aLines = msg.split( /\r?\n+/ );
for ( var i in aLines )
{
if ( !aLines[i] ) { alert( "Error!" ); continue; }
alert( i + ": \"" + aLines[i] + "\"" );
}
}
我将其分成几行,然后遍历所有行。 在索引3处没有行,并且第一个条件触发器。 那不是空行吗? 例如“”
然后,循环实际上将另一个元素移至4,并显示函数的内容。
那就是我得到的-五个警报:
0: "An item with this x Id already exists."
1: "An item with this y id already exists."
2: "An item with this barcode already exists."
Error!
最后一个是最奇怪的:
hasObject: "function(o) {
var l = this.length + 1;
... more lines ...
}
我不明白这里发生了什么。 为什么要迭代一个以上的元素? 为什么最后一个元素是函数? 而且偏移量3不应为空字符串吗? 那就是我不应该警告“错误!” 这里。
正如jbabey所说,在Javascript中使用for .. in
循环是冒险且不确定的(有时是随机顺序)。 您通常会使用它来解析关联数组中的对象。 但是,如果您坚持将for .. in
保留在其中for
使用if
块将for
的内部包裹起来,例如:
for (var i in aLines)
{
if(aLines.hasOwnProperty(i))
{
// ... Do stuff here
}
}
否则,只需将其更改为经典的增量for
循环即可消除该错误:
for (var i = 0; i < aLines.length; i++)
{
if ( !aLines[i] ) { alert( "Error!" ); continue; }
alert( i + ": \"" + aLines[i] + "\"" );
}
您应该对数组使用常规的for循环,因为for-in还将返回Array对象中的所有其他属性键。 这就是为什么您看到“ hasObject”的原因(在我的浏览器中,我看到的更多了):因为您的数组具有函数“ hasObject”,所以当您枚举Array的所有属性时就会出现。
正确的for循环:
for ( var i = 0, ii = aLines.length; i<ii; i++ )
{
if ( !aLines[i] ) { alert( "Error!" ); continue; }
alert( i + ": \"" + aLines[i] + "\"" );
}
这是将for-in循环替换为for循环的代码,它可以按预期工作:
您遇到Error!
最后,因为拆分给您空行""
并且当您使用if(!aLines[i])
检查它时,它返回true
因为它为空/空/无。 您可以点击此处查看在拨弄 ,您从末的空行,它不会随着阵列走4倍。
我还输入了以下显示警报的代码:
var a="";
if(!a){
alert("!a");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.