4

オブジェクト値がObjectコンストラクターに提供されると、その値は変更されずに返されます。したがって、オブジェクトが与えられた場合obj:

obj === new Object( obj )

obj === Object( obj )

Object( obj )では、そもそも何をする意味があるのでしょうか。やることは理解できObject( 'foo' )ますObject( 123 )が、プリミティブ値のラッパー オブジェクトを作成しますが、オブジェクトが既にある場合obj、なぜそれを行うのObject( obj )でしょうか?

このパターンは駄目ですか?

4

2 に答える 2

4

比較objでは、 が実際のオブジェクトであるかどうかがチェックされます。をチェックするのとほぼ同じです。

typeof obj == "object"

しかし、それはまたtruenullそのプロパティにアクセスしようとすると、奇妙なエラーにつながる可能性があります. そのため、書く代わりに、if (typeof obj == "object" && obj !== null)一般的に に短縮されif (obj === Object(obj))ます。

また、true関数オブジェクトに対しても生成されますが、typeofテストでは生成されませんが、プロパティを保持できるすべてのものを許可したい場合があり、関数を忘れると誰かがあなたのライブラリに腹を立てます。

パターンについては、Reid が の内部について優れた回答を書いてObjectいます。これは、質問で既に説明した動作を説明しています。

于 2012-05-14T16:02:24.557 に答える
2

それが Object 値であると仮定するとobj、何の効果もありません。ES5 の仕様を見てみましょう (イェイ!)。

§ 15.2.1.1Object([value])によれば、またはでobjない場合、 を返します。nullundefinedToObject(value)

ここで、§ 9.9 ToObjectに注意を向けます。引数が Object 型の場合、「結果は入力引数 (変換なし) になります」と書かれています。

したがって、 がObjectであることがわかってObject(obj)いる場合に使用する理論的な理由はありません。 objobj

あなたがリストした他のケースは、 § 15.2.2.1new Object(obj)に依存するものでした。が提供され、の型がオブジェクトである場合、がネイティブの ECMAScript オブジェクトである場合に返されます。ネイティブでない場合、結果は実装定義になります (したがって、ブラウザーに依存するため、私の意見では使用することはお勧めしません)。new Object([value])valuevalueobjobj

于 2012-05-14T15:55:17.433 に答える