4

アンダースコアからの最新のコードでは、211 行目で次のように表示されます

result || (result = iterator.call(context, value, index, list))) return breaker;

or ステートメントは必要ですか? で代用できますか

(result = iterator.call(context, value, index, list))) return breaker; // ?

resultは最初は false に設定されており、この 1 行以外に変更されたコードはありません。

JavaScript または (||) ステートメントは、それが true の場合は最初のオペランドを返し、それ ('it' が最初のオペランド) が false の場合は 2 番目のオペランドを返すことに注意してください。これはグッド・パーツのクロックフォードから直接届いたものです。|| にも注意してください。真/偽の値ではなく、真/偽の値で or を実行します。

上記のリンクから再現されたメソッド全体を次に示します。

var any = _.some = _.any = function(obj, iterator, context) {
    iterator || (iterator = _.identity);
    var result = false;
    if (obj == null) return result;
    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
    each(obj, function(value, index, list) {
      if (result || (result = iterator.call(context, value, index, list))) return breaker;
    });
    return !!result;
  };
4

2 に答える 2

7

result||それは、チェックが念のためであると私に思わせます...またはforEach定義されている環境をサポートするためです(たとえば、シムを介して)が、そうでsomeはありません。

コメントで指摘されているように、アンダースコアのネイティブ ループ メソッド ( forEachmapおよびその仲間) への依存は、いくつかの理由から素晴らしいアイデアではないようです。

  • 単純なループより遅い
  • 壊すことはできません(まあ、専用の例外を使えばできますが、アンダースコアはそうしません)
  • Array.prototype他の (悪意のある、またはばかげた) コードによって改ざんされる可能性がある
于 2013-06-28T14:25:41.000 に答える
3

答え:はい、ネイティブ コードの場合は、推奨される方法で最適化できます。

何が起こっているのかを理解するために、最初にそのコードをここで重要なことに単純化しましょう:

var result = false;
for (var i in obj)
{
    if (result || (result = call(i)))
        return;
}

つまり、resultすでに false でない場合call()は返されるか、false でない値が返された場合は返されます。結果は によってのみ変更されるcall()ため、最初のチェックresultは冗長です。

var result = false;
for (var i in obj)
{
    if (result = call(i))
        return;
}

call()このコードは、false 以外の値が配信されるとすぐに戻ります。

またeach()、ライブラリ関数でありbreaker、見つかった項目でOP が返されるため

実際に何が起こるかは次のとおりです。

var result = false;
for (var i in obj)
{
    if (result || (result = call(i)))
        break;
}

その場合、ライブラリの foreach 関数が使用されている限り、提案された方法でコードを最適化できます。見つかった値でループが終了します。

紛らわしい部分はeach()、ライブラリ関数であり、関数を使用してループ本体をシミュレートすることです。本体関数からライブラリ定数を返すbreakerと、ループが終了します。

each()ネイティブを使用することを決定するとすぐに、 !の戻り値を理解できない.forEach() ため、コードを最適化できなくなります。詳細については、 thg435の回答を参照してください。.forEach()breaker

于 2013-06-28T14:21:51.943 に答える