3

関数を使用して配列をループし、一致を返す場合、実際には最後に false/null を返す必要がないことに最近気付きました。

たとえば、私が持っている場合:

※編集例です。元の例は、単純化しようとした関数からのものでしたが、名前/コンテキストを変更するのを忘れていました。混乱させて申し訳ありません。これが私の質問のタイトルに合ったより良い例です:

var hasKey = hasKeyMatch(key);
function hasKeyMatch(key) {
    for (var i = 0; i < array.length) {
        if (array[i].key === key) {
            return true;
        }
    }
};

キーの戻りがない場合、hasKey は未定義になるため、実際には return false は必要ありません。したがって、引き続き hasKey をブール値として使用できます。

しかし、これは良いスタイルと見なされますか? Java のような言語では「バックアップ」の戻り値が必要であることを認識しているため、JS にその習慣を持ち込む人もいます。しかし、返品の実際のコストについてはわかりませんが、不必要な返品を最小限に抑えることが理想的だと思います.

そして、以下の質問への回答を見ると、目的の配列に既にプッシュされている変数を返すことを選択した理由について混乱しています。彼のリターンは意図的であり、返された変数をどこにも保存するつもりはないと思います。関数の最後に変数を返すことの利点 (ガベージ コレクションなど) はありますか?

html5 キャンバスの toDataURL を使用した drawImage

4

4 に答える 4

1

これはコードの堅牢性の問題であり、結果としてメソッド名が示唆する場合は、未定義ではなく常に false を返す必要があります。

コード スタイルに関係することはすべて、正しいか間違っているかという問題ではありませんが ( http://www.youtube.com/watch?v=zN-GGeNPQEg )、自分が何であるかを他の人に理解してもらうことが重要です。ばかげたバグを実行して回避します。堅固なコードは、期待どおりに動作することで、愚かなことをする可能性を回避します。

例:isA() && isB() || !isA() && !isB()のように短く書くことができますisA() == isB()。これら 2 つの関数を 1 つ (isA) が false を返し、もう 1 つ (isB) が undefined を返すように定義した場合、2 番目の式は想定どおりに動作しません。

参照: http://jsfiddle.net/wDKPd/1/

于 2013-09-03T22:30:04.917 に答える
1

function hasKeyMatch(key)メソッド文で戻り値を指定していないからではないですか?Java やその他の言語では、通常、実際に何を返すかを指定する必要があります。物事がうまくいかない場合は、「デフォルト」の return ステートメントでステートメントを終了することを常にお勧めします。念のため。いくつかの奇妙なことが起こり、コードが特定の場所で機能せず、それをキャッチして、コードを壊す可能性のある未定義のものに対して有効なものを返します。

編集:

それがあなたが探しているものである場合は、未定義の return 呼び出しを指定することを常にお勧めします。誰かがこのコードを読んでいる場合、実際に何が返されると想定されているかを知ることはできません。それがスクリプト言語の問題です。

于 2013-09-03T22:10:59.360 に答える
1

(真偽論争は無視)

個人的には、関数が意味のある場所に戻ることを気にしませんが、それが意図的であることを示すために最後にundefined追加することを検討します。return void 0;関数の最後にある return ステートメントが欠落しているということは、決してそこに到達してはならないことを示唆しています。ここでは、パフォーマンスは実際には問題ではありません。

于 2013-09-03T22:09:55.460 に答える