説明:
一部の人々が指摘しているように、これは「このコードは大丈夫ですか」というような質問のように見えます。私が実際に興味を持っている主なことは、この方法がどのように機能するかということ.hasOwnProperty
です。
つまり、IE の JScript エンジン (少なくとも 9 未満) は常にハッシュ テーブルを使用するとは限らないため、そのオブジェクトのすべてのプロパティを反復処理し、別のオブジェクトからそれらのプロパティを取得するかどうかを確認するだけだと思います。プロトタイプチェーンの上位。これは公正な仮定ですか?結局のところ: あるレベルでは、すべてのコードがループと分岐に変換されますが、IE がハッシュ テーブル.hasOwnProperty
を実行しない場合、ループを記述する必要がないということは単なる糖分ではないでしょうか?
DCのブログ投稿またはビデオの1つからこの概念を得たと思います。彼が配列について話していた可能性があり、JSでそれらが存在する(または存在する可能性がある)風変わりなものである可能性があります。ビデオ/ブログ投稿 (?) ATM が見つかりません。また、JS 配列は悪用されることが多いため、多くの人が同意すると思いますが、この質問への回答は適切な参考資料として役立つと思いました。そのため、codereview には投稿しませんでした。
現在の回答に関する限り、そして私の質問が間違った角度から始まったので(その背後にあるメカニズムよりもコードに焦点を当てています)、私がしなかった問題を指摘してくれてありがとうございます。のことを考える。
最近、私が取り組んでいたスクリプトの配列プロトタイプを拡張しました (まだ撮影しないでください)。車輪の再発明を避けるために、私は行って、他の人がどのようにそれを行ったかのいくつかの例を探しました.
これは非常に一般的であり、明らかに不必要に複雑です。私はまた、代替案として、ポスターが彼の高速アルゴリズムについてかなり独善的であることを除いて、私はまだ改善の余地があると感じています.
私は独善的な賢者として出くわすかもしれないことを知っています.私のunique
方法は実際には次のようになります:
Array.prototype.unique = function()
{
'use strict';
var i,obj,ret;
ret = [];
obj = {};
for (i=0;i<this.length;i++)
{
if (!obj.hasOwnProperty(this[i]))
{
ret.push(this[i]);
obj[this[i]] = i;
}
}
return ret;
};
このように、私が知る限り、2 番目のループは必要ありませんね。もちろん、hasOwnProperty
メソッドが非常に遅い場合を除きますが、どういうわけか、この場合、チェーンは 1 レベルまでしか戻ることができないのではないかと疑っていObject.prototype
ます。
私が投稿した 2 番目のリンクには、いくつかの統計と速度比較が含まれていますが、誰もが知っているように、現実の世界ではほとんど意味がありません。JS とベンチマークに関する優れた記事の方向性を示してくれる人はいますか ( John Resig のブログの記事は別として? )
では、好奇心から: この方法に問題がある人はいますか? さらに詳しい情報: Object.prototype: 変更なし、グローバルなし、フレームワークなし、このメソッドundefined
はundefined
やみくもに実装されていません ( if (!Array.prototype.unique){...}
)