JavaScript Garden-当死のtypeofオペレータ
4868 ワード
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
オペレータ