01.【JS基础】数据类型的判断方法

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方法,注意大小写

你可能感兴趣的:(01.【JS基础】数据类型的判断方法)