概要
typeof
演算子は、評価を行われないままの状態のオペランドのデータ型を示す文字列を返します。
構文
typeof
演算子の後に、オペランドを続けて書きます。
typeof operand
パラメーター
operand
は、そのデータ型を返してほしいオブジェクトやプリミティブを表す式。
説明
以下は typeof
が返す事が出来る値(文字列)の一覧表です。 JavaScript data structureにデータ型(types)とプリミティブについての詳しい情報があります。
型 | 戻り値 |
---|---|
未定義 | "undefined" |
Null | "object" |
真偽値 | "boolean" |
数値 | "number" |
文字列 | "string" |
シンボル (ECMAScript6 で新しく導入) | "symbol" |
ホストオブジェクト (provided by the JS environment) | 実装に委ねる |
関数オブジェクト (implements [[Call]] in ECMA-262 terms) | "function" |
E4X XML オブジェクト | "xml" |
E4X XMLList オブジェクト | "xml" |
他のオブジェクト | "object" |
例
通常のケース
// Numbers typeof 37 === 'number'; typeof 3.14 === 'number'; typeof Math.LN2 === 'number'; typeof Infinity === 'number'; typeof NaN === 'number'; // "Not-A-Number"とは言いながらこうなります typeof Number(1) === 'number'; // but never use this form! // Strings typeof "" === 'string'; typeof "bla" === 'string'; typeof (typeof 1) === 'string'; // typeof はいつも文字列を返します typeof String("abc") === 'string'; // but never use this form! // Booleans typeof true === 'boolean'; typeof false === 'boolean'; typeof Boolean(true) === 'boolean'; // but never use this form! // Symbols typeof Symbol() === 'symbol' typeof Symbol('foo') === 'symbol' typeof Symbol.iterator === 'symbol' // Undefined typeof undefined === 'undefined'; typeof blabla === 'undefined'; //未定義の変数 // Objects typeof {a:1} === 'object'; // Array.isArray や Object.prototype.toString.call によっって普通のオブジェクトと配列を区別してください typeof [1, 2, 4] === 'object'; typeof new Date() === 'object'; //ややこしい。使わないで! typeof new Boolean(true) === 'object'; typeof new Number(1) === 'object'; typeof new String("abc") === 'object'; // Functions typeof function(){} === 'function'; typeof class C {} === 'function' typeof Math.sin === 'function';
null
typeof null === 'object'; // JavaScript の誕生当初から成り立つ
JavaScript の最初の実装では、値は、型を表す「タグ」と「値そのもの」で表されていました。 オブジェクトの型タグは 0 で。そして null
のそれは NULL ポインタ(0x00 は殆どのプラットフォームに存在する)で示されていました。その為 Null の型タグは 0 と見做され、「typeof Null
は "object"」という、悪い冗談の様な結果になったのです。(出典はこちら)
この挙動はECMAScriptにオプトインとして提案されましたが、却下されました。この変更が通れば、 typeof null
は 'null' を返すようになるはずでした。
正規表現
呼び出し可能な正規表現オブジェクに対して、 typeof
演算子はいくつかのブラウザで標準的でない挙動を示します。
typeof /s/ === 'function'; // Chrome 1-12 ... // ECMAScript 5.1 に準拠していない
typeof /s/ === 'object'; // Firefox 5+ ... // ECMAScript 5.1 に準拠
仕様書
Specification | Status | Comment |
---|---|---|
ECMAScript 2017 Draft (ECMA-262) The typeof Operator の定義 |
ドラフト | |
ECMAScript 2015 (6th Edition, ECMA-262) The typeof Operator の定義 |
標準 | |
ECMAScript 5.1 (ECMA-262) The typeof Operator の定義 |
標準 | |
ECMAScript 3rd Edition (ECMA-262) The typeof Operator の定義 |
標準 | |
ECMAScript 1st Edition (ECMA-262) The typeof Operator の定義 |
標準 | Initial definition. Implemented in JavaScript 1.1. |
ブラウザ互換性
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
Basic support | (有) | (有) | (有) | (有) | (有) |
Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Basic support | (有) | (有) | (有) | (有) | (有) | (有) |
その他の例外的な実装
古いバージョンの Internet Explorer の alert
IE6、IE7、IE8 は以下の様な実装となっています。
typeof alert === 'object' //true