5

私はすべてのJavaScriptプログラムで恒等関数を使用しています。

function identity(value) {
    return value;
}

その理由は、演算子によって返されるプリミティブタイプ(、、、、および)とオブジェクトタイプ(および)をundefined区別する必要があることが多いためです。このユースケースでインデント関数を使用すると、非常に簡潔になります。nullbooleannumberstringobjectfunctiontypeof

if (new identity(value) == value); // value is of an object type
if (new identity(value) != value); // value is of a primitive type

恒等関数は、次のコードよりもはるかに小さく、単純です。

function isObject(value) {
    var type = typeof value;
    return type == "object" || type == "function";
}

しかし、私のコードを読んだとき、私の友人は、私のハックは誤解を招きやすく、上記の方法よりも計算コストが高いと不満を漏らしました。

この関数はエレガントなハックだと思うので、どのプログラムからも削除したくありません。それからまた、私は自分のためだけにプログラムを書くのではありません。JavaScriptの恒等関数の他のユースケースはありますか?

4

2 に答える 2

19

私見では:

new identity(value) == value

まったく意味がなく、余分なコメントがなければ、意図が何であったかを理解するためにしばらく考えなければなりません。一方で:

isObject(value)

どのように実装されていても、最初から明らかです。という名前の関数でハックを使用できないのはなぜisObject()ですか?

ところでhttp://codereview.stackexchange.comにより適しています。

于 2012-07-14T16:44:52.500 に答える
9

「 speedtest 」を更新して、正しい結果が返されるかどうかをテストしました...そうではありません:

と比較するとnew identity(x) == xnullはオブジェクトと見なされます。===ただし、動作します。

そのような落とし穴は、isObject(...)解決策を支持するものです。

コード内で=== 'object'/を比較すると、元の実装の 2 倍の速度になり、 のほぼ 3 分の 1 の速度になります。'function'isObjectnew identity(x) === x

于 2012-07-14T17:18:30.973 に答える