0

解析するエラーメッセージの配列を渡します。入力例は次のとおりです。

"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には、行がなく、最初の条件付きトリガーがあります。それは空の行ではありませんか?例: ""

次に、ループは実際にはもう1つの要素を4に移動し、関数の内容を表示します。

つまり、私は5つのアラートを受け取ります。

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 ...
}

ここで何が起こっているのかわかりません。なぜもう1つの要素を繰り返すのですか?そして、なぜ最後の要素が関数なのですか?そして、オフセット3は空の文字列であってはなりませんか?つまり、「エラー」を警告するべきではありません。ここ。

4

4 に答える 4

5

for...inを使用して配列をループしないでください。

オブジェクトの列挙可能なプロパティを任意の順序で繰り返します。

配列の反復で「for...in」を使用するのはなぜ悪い考えですか?

于 2012-10-19T19:13:17.260 に答える
1

jbabeyが言ったようにfor .. in、Javascriptでループを使用することは危険で不確定です(ランダムな順序-時々)。最も一般的には、連想配列内のオブジェクトを解析するために使用します。ただし、を維持することを主張する場合はfor .. in、の内側を次のようなブロックforでラップします。if

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]  + "\"" );
}
于 2012-10-19T19:16:46.927 に答える
1

for-inはArrayオブジェクト内の他のすべてのプロパティキーも返すため、配列には通常のforループを使用する必要があります。これが「hasObject」が表示される理由です(そして私のブラウザでは、その後さらに多くのことが表示されます):配列には関数「hasObject」があるため、配列のすべてのプロパティを列挙すると、これが表示されます。

正しいforループ:

  for ( var i = 0, ii = aLines.length; i<ii; i++ )
  {
    if ( !aLines[i] ) { alert( "Error!" ); continue; }
    alert( i + ": \"" + aLines[i]  + "\"" );
  }

これは、for-inループがforループに置き換えられたコードであり、期待どおりに機能します。

http://jsfiddle.net/SamFent/4rzTh/

于 2012-10-19T19:21:53.410 に答える
0

Error!分割によって空の行が""表示され、それをチェックすると、空/ null/何もないためif(!aLines[i])に返されます。trueここでフィドルで確認できます。空の行を最後から削除すると、配列を4回超えません。

また、アラートを表示する次のコードを入力しました。

    var a="";
    if(!a){
        alert("!a");
    }
于 2012-10-19T19:33:49.190 に答える