JavaScript的类型,分成原生类型和对象。其中,null, undefined, boolean(true, false), number, string是原生类型,而其他的都是对象(包括数组、类、函数)。而instanceOf是一个二元操作符,左侧是一个对象,右侧是对象的类型。所以把原生类型放在左右侧都是不合适的,instanceOf会返回false。
如下的例子帮助理解:
function test_instaceOf() { var num = 1; console.log(num instanceof Number); // false* console.log(num instanceof Object); // false* console.log(Number(num) instanceof Number); // false* console.log(Number(num) instanceof Object); // false* console.log(1 instanceof Number); // false* console.log(NaN instanceof Number); // false* console.log("" instanceof String); // false* console.log(String("abc") instanceof String); // false* console.log(new Number(num) instanceof Number); // true console.log(new Number(num) instanceof Object); // true console.log(new Number(1) instanceof Number); // true console.log(new Number(NaN) instanceof Number); // true console.log(new String("") instanceof String); // true console.log(new String("abc") instanceof String); // true console.log({} instanceof Object); // true console.log([] instanceof Object); // true console.log([] instanceof Array); // true console.log(new Object(null) instanceof Object); // true console.log(null instanceof Object); // false console.log(undefined instanceof Object); // false try { console.log(undefined instanceof undefined); } catch (e) { console.log("exception"); // exception! } }注意,只有使用了new关键字,才能把原生类型正真转换成对象(相当于wrap在对象里面),而简单的类型转换(用Number, String)是没用的。
另外, typeOf操作符,是一元操作符,可以用来检测原生类型,他接受任意类型,返回的是一个字符串(小写):
function test_typeof() { console.log(typeof 1); // number console.log(typeof true); // boolean console.log(typeof "string"); // string console.log(typeof new Date(2001, 1, 1)); // object console.log(typeof new RegExp("reg expression")); // object console.log(typeof function () { }); // function console.log(typeof {}); // object console.log(typeof []); // object console.log(typeof null); // object console.log(typeof undefined); // undefined console.log(typeof NaN); // number }