ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScriptにおけるtypeofとinstanceofの比較使用例を詳しく解説

JavaScriptにおけるtypeofとinstanceofの比較使用例を詳しく解説

伊谢尔伦
伊谢尔伦オリジナル
2017-07-22 15:41:471649ブラウズ

typeof

まずtypeofについて話しましょう。まず注意すべきことは、typeof メソッドはデータのタイプを表す文字列を返すということです。

typeof はオペランドの前に置かれる単項演算であり、オペランドは任意の型にすることができます。

戻り値は、オペランドの型を説明する文字列です。 Typeof は通常、
数値、ブール値、文字列、関数、オブジェクト、未定義の結果のみを返すことができます。 if(a) を使用する代わりに、typeof を使用して、変数が存在するかどうかを取得することができます (例: if(typeof a!="unknown"){alert("ok")}。 a が存在しない (宣言されていない) 場合は、エラーが発生した場合、配列や Null などの特殊なオブジェクトに対して typeof を使用すると、常に object が返されます。これは typeof の制限です。

文法説明

まず、各データ型に対応する typeof の値を見てみましょう:

typeof 37 === 'number';
typeof 3.14 === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // 尽管NaN是"Not-A-Number"的缩写,意思是"不是一个数字"
typeof Number(1) === 'number'; // 不要这样使用!
// Strings
typeof "" === 'string';
typeof "bla" === 'string';
typeof (typeof 1) === 'string'; // typeof返回的肯定是一个字符串
typeof String("abc") === 'string'; // 不要这样使用!
// Booleans
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(true) === 'boolean'; // 不要这样使用!
// 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';
// 函数
typeof function(){} === 'function';
typeof Math.sin === 'function';

typeof がデータ型を正確に判断していないという問題が見つかります。たとえば、配列、正規表現、日付、オブジェクトの戻り値の typeof はすべてオブジェクトであるため、エラーが発生します。

そのため、型を決定する typeof に基づいて、Object.prototype.toString メソッドを使用してデータ型をさらに決定する必要もあります。

同じデータ型の場合のtoStringメソッドとtypeofメソッドの戻り値の違いを見てみましょう:

データ toString typeof
"foo" String string
new String("foo") String オブジェクト
新しい番号( 1.2) 数値 オブジェクト
tru​​e ブール ブール
new Boolean(true) Boolean object
new Date() Date object
new Error() Error object
新しい配列(1, 2, 3) Array object
/abc/g RegExp object
new RegExp(“meow”) RegExp object

可以看到利用toString方法可以正确区分出Array、Error、RegExp、Date等类型。

所以我们一般通过该方法来进行数据类型的验证

instanceof

接下来该说说instanceof方法了。instanceof运算符可以用来判断某个构造函数的prototype属性是否存在于另外一个要检测对象的原型链上。

instanceof 用于判断一个变量是否某个对象的实例,如 var a=new Array();alert(a instanceof Array); 会返回 true,同时 alert(a instanceof Object) 也会返回 true;这是因为 Array 是 object 的子类。再如:function test(){};var a=new test();alert(a instanceof test) 会返回

谈到 instanceof 我们要多插入一个问题,就是 function 的 arguments,我们大家也许都认为 arguments 是一个 Array,但如果使用 instaceof 去测试会发现 arguments 不是一个 Array 对象,尽管看起来很像。

如果对原型不太了解,可以看看深入理解原型。

下面我们看看instanceof的实例:

// 定义构造函数
function C(){} 
function D(){} 
var o = new C();
// true,因为 Object.getPrototypeOf(o) === C.prototype
o instanceof C; 
// false,因为 D.prototype不在o的原型链上
o instanceof D; 
o instanceof Object; // true,因为Object.prototype.isPrototypeOf(o)返回true
C.prototype instanceof Object // true,同上
C.prototype = {};
var o2 = new C();
o2 instanceof C; // true
o instanceof C; // false,C.prototype指向了一个空对象,这个空对象不在o的原型链上.
D.prototype = new C(); // 继承
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true

但是这里我们需要注意一个问题:

function f(){ return f; }
document.write(new f() instanceof f);//false
function g(){}
document.write(new g() instanceof g);//true

第一个为什么返回false呢?因为构造函数的原型被覆盖了。


以上がJavaScriptにおけるtypeofとinstanceofの比較使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。