2

これはとても簡単で、私は困惑しています。私は次のものを持っています:

var x = 'shrimp';    
var stypes = new Array('shrimp', 'crabs', 'oysters', 'fin_fish', 'crawfish', 'alligator');
for (t in stypes) {
    if (stypes[t] != x) {
        alert(stypes[t]);
    }
}

値が繰り返されると、次のような多数の関数を返し始めます

function (iterator, context) {
    var index = 0;
    iterator = iterator.bind(context);
    try {
        this._each(function (value) {iterator(value, index++);});
    } catch (e) {
        if (e != $break) {
            throw e;
        }
    }
    return this;
}

一体何が起こっているのですか?

編集:これらのスクリプトでは、http://script.aculo.us/prototype.jshttp://script.aculo.us/scriptaculous.jsを使用し ています。プロトタイプが配列を拡張する方法について読んだことを覚えています。これに賭けていますその一部です。どうすれば対処できますか?

4

4 に答える 4

7

for列挙は、渡されたオブジェクトのすべてのメンバーを調べます。この場合、渡された要素だけでなく、メンバとして関数をたまたま持つ配列です。

forループを書き直して、typeof stypes[t] == "function"yada yadaかどうかを確認できます。しかし、IMOは、ループを要素のみに変更する方がよい..

for(var i = 0, t; t = stypes[i]; ++i){
    if (t != x) {
        alert(t);
    }
}

または

for(var i = 0; i < stypes.length; ++i){
    if (stypes[i] != x) {
        alert(stypes[i]);
    }
}

最初のタイプのループの警告の通知を追加するために、最後のコメントを回答まで移行したかったのです。

Simon Willison の「A re-introduction to JavaScript」より..

for (var i = 0, item; item = a[i]; i++) {
    // Do something with item
}

ここでは、2 つの変数を設定しています。for ループの中間部分の代入も真偽がテストされます。成功すると、ループが続行されます。i は毎回インクリメントされるため、配列のアイテムは順番に item に割り当てられます。「誤った」項目が見つかった場合 (未定義など)、ループは停止します。

このトリックは、「偽の」値が含まれていないことがわかっている配列 (オブジェクトの配列や DOM ノードなど) に対してのみ使用する必要があることに注意してください。0 を含む可能性のある数値データまたは空の文字列を含む可能性のある文字列データを反復処理する場合は、代わりに i, j イディオムを使用する必要があります。

于 2009-09-29T23:17:12.817 に答える
3

あなたがしたい:

for (var i in object) {
    if (!object.hasOwnProperty(i))
        continue;
    ... do stuff ...
}

for..in 列挙は、オブジェクトとそのプロトタイプ チェーンの両方に存在するすべてのプロパティ (列挙可能またはそれ以外) を反復処理します。チェックはhasOwnProperty、列挙する実際のオブジェクトのプロパティのみに反復を制限します。

ES5 は、ライブラリ開発者にとって物事を少し改善します (そして、このようなことを回避するのに役立ちます) が、出荷されたブラウザーでは、かなりの期間、それを目にすることはありません :-(

[編集: return を continue に置き換えます。ラララララ ;) ]

于 2009-09-29T23:29:06.090 に答える
1

プロトタイプは利便性のために配列を拡張しているため、それを利用する必要があります。あなたの例は次のように書き直すことができます:

var x = 'shrimp';    
var stypes = new Array('shrimp', 'crabs', 'oysters', 'fin_fish', 'crawfish', 'alligator');
stypes.without(x).each(alert);
于 2011-01-24T12:40:43.383 に答える
-3

そのはず

for (t in stypes) {
    if (t != x) {
        alert(t);
    }
}
于 2009-09-29T23:17:43.767 に答える