0

これはしばらく私を悩ませました。私の jsfiddle: http://jsfiddle.net/DHR8Q/を参照してください。これには、次の JavaScript コードが含まれています。

var id = "11111;22222;33333";

id = id.split(";");

alert(typeof id);

for (var i in id){
    alert(id[i]);
}​

変数を文字「;」で分割すると、for ループを使用すると、文字列が 3 つの部分に分割されたのではないかidと推測されますが、これは起こりません。実際には。JavaScript がこれを行うのはなぜですか?i == 0,1,2idi == 0,1,2,3,4...

4

4 に答える 4

11

リンク先の jsFiddle には Mootools ライブラリが含まれているためです。に独自のメソッドを追加しますArray.prototype

を使用して配列を列挙すると、すべての属性for inがループされます。それらの方法を含む; これはあなたが見ているものです。

hasOwnProperty()代わりに を使用しチェックする必要があります。for(;;);

for (var i in id){
    if (id.hasOwnProperty(i)) {
        alert(id[i]);
    }
}​

(jsフィドル)

また

for (var i=0;i<id.length;i++) {
    alert(id[i]);
}

(jsフィドル)

于 2012-04-20T15:48:14.907 に答える
4

これはfor... in、 がオブジェクトのすべてのプロパティ ( のプロパティを含むprototype) を反復処理するためです。

配列をfor... in処理すると、配列要素、lengthプロパティ、および のすべてのプロパティが取得されますArray.prototype

次を使用してこれを修正できますhasOwnProperty

for (var i in id){
    if(id.hasOwnProperty(i){
        alert(id[i]);
    }
}​

for... inただし、配列には使用しないことをお勧めします。次を使用しforEachます。

id.forEach(function(v){
    alert(v);
});

または古き良き for ループ:

for(var i=0, len=id.length; i<len; i++){
    alert(id[i]);
}

編集

このforEach関数は、バックレベルのブラウザーでは組み込みとして利用できないため、次のようにすることができます。

if (typeof Array.prototype.forEach !== 'function') {
    Array.prototype.forEach = function(fn, thisObj) {
        var scope = thisObj || window,  L = this.length, i;
        for (i=0; i < L; ++i) {
            fn.call(scope, this[i], i, this);
        }
    };
}
于 2012-04-20T15:49:43.503 に答える
2

JS の配列はオブジェクトです。配列に対して for...in を実行すると、そのオブジェクトのすべてのインデックスとすべてのプロトタイプ メンバーが取得されます。あなたの場合、プロトタイプメンバーには一連の配列関数が含まれていました。

数値インデックスを反復処理するには、通常の for ループを使用する必要があります。

emacsのJSShellからのこの出力は、次のことを示しています。

js> 
Multi-line input. Use two consecutive blank lines to eval.

var id = "11111;22222;33333"; 

id = id.split(";"); 

js> function say (x) {WScript.echo(x);}
js> for (var i in id) { say (i); } 
0
1
2
forEach
every
map
filter
remove
removeAt
indexOf
contains
js> for(var i=0;i<id.length;i++) { say (i + ": " + id[i]); } 
0: 11111
1: 22222
2: 33333
js>

参照: JavaScript ループ: for...in vs for

于 2012-04-20T15:51:02.113 に答える
1

第一に順序が保証されないため、これを配列に使用しないでください。第二に、いくつかのフレームワークが列挙される配列プロトタイプにプロパティを追加するため、配列には望ましくない可能性があるオブジェクトのすべての列挙可能なプロパティをリストするために使用されます。

于 2012-04-20T16:13:17.803 に答える