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
}