在 JavaScript 中,typeof 和 instanceof 这两个操作符都可以用于区分不同的变量。这里总结一下。
typeof 用于检测数据类型,它的基本用法如下面的例子:
var u; var b = true; var i = 1234; var s = "abc"; var f = function(){}; var n = null; var o = {key: "value"}; var a = [1, 2, 3]; console.log(typeof u); // undefined console.log(typeof b); // boolean console.log(typeof i); // number console.log(typeof s); // string console.log(typeof f); // function console.log(typeof n); // object console.log(typeof o); // object console.log(typeof a); // object
这是最简单的情形,需要注意后面三个的数据类型都是 object。接着看下面的例子
var b = new Boolean(true); var i = new Number(1234); var s = new String("abc"); var o = new Object(); var F = function(){}; var f = new F(); var g = new Function("alert(1);"); console.log(typeof b); // object console.log(typeof i); // object console.log(typeof s); // object console.log(typeof o); // object console.log(typeof f); // object console.log(typeof g); // function
也就是说,用 new 方式得到的都是 object,除了最后一种情形是 function。
instanceof 操作符用于检测某个对象是否某构造函数的实例。基本的例子如下:
var b = new Boolean(true); var i = new Number(1234); var s = new String("abc"); var a = [1, 2, 3]; var r = new Array(3); var o = {key: "value"}; var j = new Object(); var F = function(){}; var f = new F(); var g = new Function("alert(1);"); console.log(b instanceof Boolean); // true console.log(i instanceof Number); // true console.log(s instanceof String); // true console.log(a instanceof Array); // true console.log(r instanceof Array); // true console.log(o instanceof Object); // true console.log(j instanceof Object); // true console.log(f instanceof F); // true console.log(g instanceof Function); // true
但是,对于不由构造函数生成的数据,instanceof 总是返回 false。例如:
var b = true; var i = 1234; var s = "abc"; var u; var n = null; console.log(b instanceof Boolean); // false console.log(i instanceof Number); // false console.log(s instanceof String); // false console.log(u instanceof Object); // false console.log(n instanceof Object); // false
参考资料:
[1] typeof - JavaScript | MDN
[2] instanceof - JavaScript | MDN
[3] JavaScript 秘密花园 #typeof
[4] JavaScript: Check if object is array? - Stack Overflow
[5] Nifty Snippets: Say what?
[6] Remedial JavaScript - Douglas Crockford