JavaScript Garden-当死のtypeofオペレータ


typeof オペレータtypeof オペレータ  instance of JavaScriptの中で一番大きな設計欠陥かもしれません.彼らから欲しい結果を得ることはほとんど不可能です.
にもかかわらず  instanceof いくつかの極めて少数のアプリケーションシーンがあります. 1つの実際のアプリケーションだけがあり(訳者注:この実際のアプリケーションは、1つのオブジェクトが定義されているかどうかを検出するためのものであり、このアプリケーションは、オブジェクトのタイプを検査するためのものではない.
注意: によって  typeof 関数のような文法で呼び出すこともできます.  typeofですが、これは関数コールではありません.二つの小かっこは一つの表式の値だけを計算します.この戻り値は  typeof(obj) 操作子の一つの操作数.実は存在しません.  typeof の関数です
JavaScriptタイプ表
Value               Class      Type
-------------------------------------
"foo"               String     string
new String("foo")   String     object
1.2                 Number     number
new Number(1.2)     Number     object
true                Boolean    boolean
new Boolean(true)   Boolean    object
new Date()          Date       object
new Error()         Error      object
[1,2,3]             Array      object
new Array(1, 2, 3)  Array      object
new Function("")    Function   function
/abc/g              RegExp     object (function in Nitro/V8)
new RegExp("meow")  RegExp     object (function in Nitro/V8)
{}                  Object     object
new Object()        Object     object
上の表の中、Type 一列に表示する  typeof 演算子の演算結果.この値はほとんどの場合「object」に戻ります.
クラス 一列はオブジェクトの内部属性を表します.  typeof の値を返します
JavaScript標準文書で定義されています.  [[Class]] の値は次の文字列のうちの一つだけです.[[Class]]、  Arguments、  Array、  Boolean、  Date、  Error、  Function、  JSON、  Math、  Number、  Object、  RegExp.
オブジェクトを取得するための  String、定義を使用したいです.  [[Class]] 上の方法  Object.prototypeオブジェクトのクラス定義
JavaScript標準文書は一つの取得のみを提供しています.  toString 値の使い方は[[Class]]を使うことです.
function is(type, obj) {
    var clas = Object.prototype.toString.call(obj).slice(8, -1);
    return obj !== undefined && obj !== null && clas === type;
}

is('String', 'test'); // true
is('String', new String('test')); // true
上記の例では、Object.prototype.toString 方法が呼び出されました.this. 取得するために設定されています.  Object.prototype.toString値のオブジェクト.
訳者注:[[Class]] 標準書式文字列を返します.  Object.prototype.toStringは、指定された位置の文字列を切り取り、以下のように示しています.
Object.prototype.toString.call([])  // "[object Array]"
Object.prototype.toString.call({})  // "[object Object]"
Object.prototype.toString.call(2)   // "[object Number]"
ES 5ヒント: ECMAScript 5では、便利のために  slice 和  null 呼び出しundefined 方法で、その戻り値は  Object.prototype.toString になりました  Object 和  Null訳者注:このような変化は、IE 8とFirefox 4から区別が見える.
// IE8
Object.prototype.toString.call(null)    // "[object Object]"
Object.prototype.toString.call(undefined)   // "[object Object]"

// Firefox 4
Object.prototype.toString.call(null)    // "[object Null]"
Object.prototype.toString.call(undefined)   // "[object Undefined]"
定義変数としてテスト
typeof foo !== 'undefined'
上のコードが検出されます.  Undefined 定義済みかどうか定義なしで直接使用すると、結果として  foo の異常です.これは  ReferenceError 唯一の役に立つところ.
結論
オブジェクトの種類を検出するためには、使用を強く推奨します.  typeof メソッドこれは唯一の頼りになる方法だからです.上記の表に示すように、Object.prototype.toString のいくつかの戻り値は標準文書では定義されていませんので、異なるエンジン実装が可能です.
変数が定義されているかどうかを検出するためには、なるべく使わないようにします.  typeof オペレータ