1.typeof方法
此类方法适用于非object的类型判断,返回变量类型。
var str = "abc";
var num = 123;
var arr = [1,2,3];
var boolean = true;
var obj = {a:1,b:2,c:3};
var fn1 = function(){alert(123);};
var date = new Date ();
var aaa;
var bbb = null;
console.log(typeof str); //string
console.log(typeof num); //number
console.log(typeof arr); //object
console.log(typeof boolean); //boolean
console.log(typeof obj); //object
console.log(typeof fn1); //function
console.log(typeof date); //object
console.log(typeof aaa); //undefined
console.log(typeof bbb); //object
注意:
- i. typeof 可以判断function类型的变量;
- ii. typeof 不能判断object的具体类型(数组/对象/null/日期均返回object类型);
- iii. 已声明但未初始化(赋值)的变量typeof返回undefined,初始化值为null的变量typeof返回object
- iv. typeof NaN返回"number"
2.instanceof方法——判断对象类型(基于原型链的操作符)
此方法适用于已知变量类型为object,判断该对象的具体类型(注意大小写),返回值为布尔值。
obj instanceof Object
- 左操作数obj :期望值是一个对象,如果是基本类型,返回false
- 右操作符Object : 函数对象或函数构造器, 如果不是,抛出typeerror异常
console.log(arr instanceof Array); //true
console.log(fn1 instanceof Function); //true
console.log(date instanceof Date); //true
console.log(obj instanceof Object); //true
3.constructor方法
类似于instanceof方法,但在继承时会出错,慎用
console.log(arr.constructor === Array); //true
console.log(fn1.constructor === Function); //true
console.log(date.constructor === Date); //true
console.log(obj.constructor === Object); //true
在出现继承时:
function Student () {}; //构造函数Student
function Person () {}; //构造函数Person
Student.prototype = new Person(); //Student继承自Person
var Jack = new Student(); //通过构造函数Student创建一个名为Jack的对象
console.log(Jack.constructor === Person); //true
console.log(Jack.constructor === Student); //flase
//但用instanceof方法时,对象直接继承和间接继承都报true
console.log(Jack instanceof Person); //true
console.log(Jack instanceof Student); //true
4.prototype方法(通用)
此方法为通用方法,但较繁琐,注意大小写
console.log(Object.prototype.toString.call(str); //[Object String]
console.log(Object.prototype.toString.call(num); //[Object Number]
console.log(Object.prototype.toString.call(fn); //[Object Function]
console.log(Object.prototype.toString.call(obj); //[Object Object]
console.log(Object.prototype.toString.call(date); //[Object Date]
console.log(Object.prototype.toString.call(aaa); //[Object Undefined]
console.log(Object.prototype.toString.call(bbb); //[Object Null]
console.log(Object.prototype.toString.call(arr); //[Object Array]
console.log(Object.prototype.toString.call(boolean); //[Object Boolean]
小结:
- a. 不判断Object具体类型时:用typeof方法判断即可;
- b. 仅判断Object具体类型时:用instanceof或constructor方法,但constructor方法在有继承的情况下会出错,尽量使用instanceof
- c. 非Object类型与Object具体类型都要判断时:用prototype方法,注意大小写
网友评论