4

オブジェクトをテストするための underscore.js からのスニペット

_.isObject = function(obj) {
    return obj === Object(obj);
  };

タイプをチェックするために、これは正確に何をしているのですか?

jsperf は、これが従来のチェックを使用するよりも高速であることを示しているため、使用されています。

4

3 に答える 3

5

Object コンストラクターは、指定された値のオブジェクト ラッパーを作成します。値が null または未定義の場合、空のオブジェクトを作成して返します。それ以外の場合は、指定された値に対応する型のオブジェクトを返します。

ソース

于 2013-04-11T17:53:51.577 に答える
1

関連するドキュメントが見つかりませんが、Object関数は渡された値をラップする新しいオブジェクトを返すか、既にオブジェクトである場合は引数を返すようです。そうしないと、===テストは常に false を返します。

Object(5) === 5         // false, Object(5) creates Number object
Object(null) === null   // false, Object(null) creates an empty object

var foo = { prop: 'value' };
Object(foo) === foo     // true!? Argument is not wrapped

この動作は、値がオブジェクトかどうかをテストするために機能するようです。

アップデート

これは仕様にあるようです:

Object 関数が引数なしで、または 1 つの引数値で呼び出されると、次の手順が実行されます
。同じ引数で呼び出されていました (15.2.2.1)。
2. ToObject(値) を返します。

また、ToObject の「結果が入力オブジェクトである」ことも仕様で定義されています。

于 2013-04-11T18:06:26.167 に答える
1

Object(obj) は何をしますか?

The ObjectConstructor Called as a Functionと the abstract ToObjectoperationの EcmaScript 仕様を読んでください。

タイプをチェックするために、これは正確に何をしているのですか?

Object(obj)は、入力が非プリミティブ値 ( 、ブール値、文字列、数値など)である場合、つまり、EcmaScript===オブジェクト(文字列/ブール値/ Number/Array インスタンス、関数、その他のオブジェクト)。objnullundefined

于 2013-04-13T14:53:14.813 に答える