JavaScript では、プリミティブ(ブール値、null、数値、文字列、および値undefined
(および ES6 のシンボル) ) を除いて、すべてがオブジェクトです (または少なくともオブジェクトとして扱われる場合があります)。
console.log(typeof true); // boolean
console.log(typeof 0); // number
console.log(typeof ""); // string
console.log(typeof undefined); // undefined
console.log(typeof null); // object
console.log(typeof []); // object
console.log(typeof {}); // object
console.log(typeof function () {}); // function
ご覧のとおり、オブジェクト、配列、および値null
はすべてオブジェクトと見なされます (null
は存在しないオブジェクトへの参照です)。関数は、特別なタイプの呼び出し可能なオブジェクトであるため、区別されます。しかし、それらはまだオブジェクトです。
一方、リテラルtrue
、0
、""
およびundefined
はオブジェクトではありません。これらは JavaScript のプリミティブ値です。ただし、ブール値、数値、および文字列にもコンストラクターBoolean
がNumber
ありString
、それぞれのプリミティブをラップして追加機能を提供します。
console.log(typeof new Boolean(true)); // object
console.log(typeof new Number(0)); // object
console.log(typeof new String("")); // object
ご覧のとおり、プリミティブ値がBoolean
、Number
およびString
コンストラクター内にそれぞれラップされると、それらはオブジェクトになります。instanceof
演算子はオブジェクトに対してのみ機能します (これが、プリミティブ値に対して返される理由ですfalse
)。
console.log(true instanceof Boolean); // false
console.log(0 instanceof Number); // false
console.log("" instanceof String); // false
console.log(new Boolean(true) instanceof Boolean); // true
console.log(new Number(0) instanceof Number); // true
console.log(new String("") instanceof String); // true
ご覧のとおり、値がブール値、数値、または文字列であるかどうかをテストするには、typeof
との両方instanceof
が不十分typeof
です。プリミティブなブール値、数値、および文字列に対してのみ機能します。プリミティブブール値、数値、および文字列では機能しinstanceof
ません。
幸いなことに、この問題には簡単な解決策があります。のデフォルトの実装toString
(つまり でネイティブに定義されている) は、プリミティブ値とオブジェクトの両方Object.prototype.toString
の内部プロパティを返します。[[Class]]
function classOf(value) {
return Object.prototype.toString.call(value);
}
console.log(classOf(true)); // [object Boolean]
console.log(classOf(0)); // [object Number]
console.log(classOf("")); // [object String]
console.log(classOf(new Boolean(true))); // [object Boolean]
console.log(classOf(new Number(0))); // [object Number]
console.log(classOf(new String(""))); // [object String]
値の内部[[Class]]
プロパティは、値よりもはるかに便利ですtypeof
。Object.prototype.toString
次のように、独自の (より便利な) バージョンのtypeof
オペレーターを作成するために使用できます。
function typeOf(value) {
return Object.prototype.toString.call(value).slice(8, -1);
}
console.log(typeOf(true)); // Boolean
console.log(typeOf(0)); // Number
console.log(typeOf("")); // String
console.log(typeOf(new Boolean(true))); // Boolean
console.log(typeOf(new Number(0))); // Number
console.log(typeOf(new String(""))); // String
この記事がお役に立てば幸いです。プリミティブとラップされたオブジェクトの違いの詳細については、次のブログ投稿を参照してください: JavaScript プリミティブの秘密の生活