四种判断方法
typeof
基本类型数据(除了Null,返回‘object’)都能准确检测;
大部分引用类型(除了Function,返回'function'),其他都不能准确检测(返回'object')
javascript
console.log(typeof 1); // 'number'
console.log(typeof 'lunlun'); // 'string'
console.log(typeof false); // 'boolean'
console.log(typeof function () {}); // 'function'
console.log(typeof undefined); // 'undefined'
console.log(typeof {}); // 'object'
console.log(typeof []); // 'object'
console.log(typeof null); // 'object'
instanceof
只能准确判断引用类型(原理是:右边变量的prototype在左边变量的原型链上)
只能判断实例关系,不能判断具体类型
javascript
console.log(7 instanceof Number); // false
let num =new Number(1);
console.log(num instanceof Number) //true
console.log('7' instanceof String); // false
console.log(false instanceof Boolean); // false
console.log([] instanceof Array); //true
console.log(function () {} instanceof Function); // true
console.log({} instanceof Object); // true
let date = new Date()
console.log(date instanceof Date ); // true
// undefined is not a constructor
// null is not a constructor
constructor
都能准确检测,但null和undefined不能被检测,没有原生构造函数
javascript
let num = 123;
let str = "biu~";
let date = new Date();
let reg = new RegExp();
let bool = true;
let fn = function () {};
let array = [1, 2, 3];
let obj = {}
console.log(num.constructor === Number)//true
console.log(str.constructor === String)//true
console.log(bool.constructor === Boolean)//true
console.log(date.constructor === Date)//true
console.log(reg.constructor === RegExp)//true
console.log(fn.constructor === Function)//true
console.log(array.constructor === Array)//true
console.log(obj.constructor === Object)//true
Object.prototype.toString.call()
都能准确检测
javascript
Object.prototype.toString.call();
console.log(toString.call(123)); //'[object Number]'
console.log(toString.call('123')); //'[object String]'
console.log(toString.call(undefined)); //'[object Undefined]'
console.log(toString.call(null)); //'[object Null]'
console.log(toString.call(true)); //'[object Boolean]'
console.log(toString.call({})); //'[object Object]'
console.log(toString.call([])); //'[object Array]'
console.log(toString.call(function(){})); //'[object Function]'