首先要知道 js 的数据类型有哪些
基本类型:Number、Boolean、String、Undefined、Null 、Symbol(es6 新增)
引用类型:Object
判断方法:
- typeof
console.log(typeof(1)); //number
console.log(typeof(true)); //boolean
console.log(typeof('1')); //string
console.log(typeof(a)); //undefined
console.log(typeof(function(){alert(111)})); //function
console.log(typeof(Symbol())); //symbol
console.log(typeof(null)); //object
console.log(typeof([])); //object
console.log(typeof(/sa/)); //object
console.log(typeof(new Date())); //object
小结: typeof 返回值包括 Number、Boolean、String、Undefined、Symbol(es6 新增)、Object
- instanceof
console.log([] instanceof Array);
console.log([] instanceof Object);
console.log(/as/ instanceof RegExp);
console.log({} instanceof Object);
console.log(new Date() instanceof Date);
function Person(){};
console.log(new Person() instanceof Object);
小结:instanceof 只能确定两个对象是否属于原型关系,但是不能具体确定类型,比如 [] 既是 Array 的实例,也是 Object 的实例
- Object.prototype.toString.call
console.log(Object.prototype.toString.call('')) ; // [object String]
console.log(Object.prototype.toString.call(1)) ; // [object Number]
console.log(Object.prototype.toString.call(true)) ; // [object Boolean]
console.log(Object.prototype.toString.call(Symbol())); //[object Symbol]
console.log(Object.prototype.toString.call(undefined)) ; // [object Undefined]
console.log(Object.prototype.toString.call(null)) ; // [object Null]
console.log(Object.prototype.toString.call(new Function())) ; // [object Function]
console.log(Object.prototype.toString.call(new Date())) ; // [object Date]
console.log(Object.prototype.toString.call([])) ; // [object Array]
console.log(Object.prototype.toString.call(new RegExp())) ; // [object RegExp]
console.log(Object.prototype.toString.call(new Error())) ; // [object Error]
console.log(Object.prototype.toString.call(document)) ; // [object HTMLDocument]
console.log(Object.prototype.toString.call(window)) ; //[object global] window是全局对象 global 的引用
小结:需要注意的是,必须通过 call 或 apply 来调用,而不能直接调用 toString 。
从原型链的角度讲,所有对象的原型链最终都指向了 Object, 按照JS变量查找规则,其他对象应该也可以直接访问到 Object 的 toString方法,而事实上,大部分的对象都实现了自身的 toString 方法,这样就可能会导致 Object 的 toString 被终止查找,因此要用 call/apply 来强制调用Object 的 toString 方法。