私は、さまざまなブラウザのさまざまなライブラリからisPlainObject関数のテストを行ってきました。
さまざまなオブジェクトでテストされている4つの異なる(コード単位の)isPlainObject関数があります。
- jquery
- lodash
- ユーティリティ(私が取り組んでいるライブラリ)
- 代替案、以下のコメントで提案
上記の4つすべてが、Chromev23.0.1271.95からChromev25.0.1364.160、FireFox v 19.0、Opera v12.14までの違いを示していますが、ユーティリティは、すべてのブラウザでこれらのオブジェクトに対して少なくとも同じfalseの応答を返します。
Chromeで実行した場合のjsfiddleでのテスト
Failed to agree: JSON - jquery: true - utility: false - lodash: true - alt: false
Failed to agree: Math - jquery: true - utility: false - lodash: true - alt: false
Failed to agree: top - jquery: false - utility: false - lodash: true - alt: true
Failed to agree: parent - jquery: false - utility: false - lodash: true - alt: true
- ルーチンはオブジェクトがプレーンであると見なし、falseはプレーンではないと考えることはtrueです。
編集:私はすべてのルーチンが次の同様の基準を使用していると信じています:
jqueryの状態
オブジェクトがプレーンオブジェクト(「{}」または「新しいオブジェクト」を使用して作成されたもの)であるかどうかを確認します。
lodashstates
指定された値がObjectコンストラクターによって作成されたオブジェクトであるかどうかを確認します。
ホストオブジェクトは「{}」または「新しいオブジェクト」を使用して構築されたオブジェクトと同じではないことを理解しているので、私の質問は、ホストオブジェクトをプレーンオブジェクトとしてカウントする必要があるかどうかです。
現在、ユーティリティは一貫しており、そうではないと言っていますが、他のルーチンは、異なるブラウザ上のホストオブジェクトに対して異なる結果をもたらします。
編集:結果の正確さは私にとって最も重要な要素であり、パフォーマンスは二次的な考慮事項です。
3つのライブラリのパフォーマンス結果と推奨される代替案はjsperfで入手できます。
編集:これはユーティリティライブラリ関数であるため、コードを検索する必要はありません。
defineProperty(utility, "isPlainObject", {
value: (function () {
var o = {};
return function (obj) {
try {
return utility.isObject(obj) && getPrototypeOf(obj).isPrototypeOf(o);
} catch (e) {
return false;
}
};
}())
});