typeof
: 不能准确判断 null 和 Array ,会将其判断成Object类型
console.log(typeof 2);
console.log(typeof true);
console.log(typeof 'str');
console.log(typeof []);
console.log(typeof function(){});
console.log(typeof {});
console.log(typeof undefined);
console.log(typeof null);
instanceof
: 只能准确判断引用类型数据 , 不能判断基本数据类型
console.log(2 instanceof Number);
console.log(true instanceof Boolean);
console.log('str' instanceof String);
console.log([] instanceof Array);
console.log(function(){} instanceof Function);
console.log({} instanceof Object);
constructor
: 判断值在不在构造函数的原型链上 , 一般可以正确判断 , 若修改了原型链就不行
console.log((2).constructor === Number);
console.log((true).constructor === Boolean);
console.log(('str').constructor === String);
console.log(([]).constructor === Array);
console.log((function() {}).constructor === Function);
console.log(({}).constructor === Object);
Object.prototype.toString.call(obj).slice(8,-1)
: 最强判断方法 , 因为String , function等会重新写toString代码 , 所以我们要到Object原型链上去找toString方法
var a = Object.prototype.toString;
console.log(a.call(2).slice(8,-1));
console.log(a.call(true));
console.log(a.call('str'));
console.log(a.call([]));
console.log(a.call(function(){}));
console.log(a.call({}));
console.log(a.call(undefined));
console.log(a.call(null));