オブジェクトをテストするための underscore.js からのスニペット
_.isObject = function(obj) {
return obj === Object(obj);
};
タイプをチェックするために、これは正確に何をしているのですか?
jsperf は、これが従来のチェックを使用するよりも高速であることを示しているため、使用されています。
オブジェクトをテストするための underscore.js からのスニペット
_.isObject = function(obj) {
return obj === Object(obj);
};
タイプをチェックするために、これは正確に何をしているのですか?
jsperf は、これが従来のチェックを使用するよりも高速であることを示しているため、使用されています。
Object コンストラクターは、指定された値のオブジェクト ラッパーを作成します。値が null または未定義の場合、空のオブジェクトを作成して返します。それ以外の場合は、指定された値に対応する型のオブジェクトを返します。
関連するドキュメントが見つかりませんが、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 の「結果が入力オブジェクトである」ことも仕様で定義されています。
Object(obj) は何をしますか?
The Object
Constructor Called as a Functionと the abstract ToObject
operationの EcmaScript 仕様を読んでください。
タイプをチェックするために、これは正確に何をしているのですか?
Object(obj)
は、入力が非プリミティブ値 ( 、ブール値、文字列、数値など)である場合、つまり、EcmaScript===
オブジェクト(文字列/ブール値/ Number/Array インスタンス、関数、その他のオブジェクト)。obj
null
undefined