1: typeof:
1:typeof 一般被用于判断一个变量的类型,我们可以利用 typeof 来判断number,  string,  object,boolean,  function, undefined,  symbol 这七种类型,
2:但是,typeof 在判断一个 object的数据的时候只能告诉我们这个数据是 object, 而不能细致的具体到是哪一种 object
3:所以在typeof判断类型的基础上,我们还需要利用Object.prototype.toString方法来进一步判断数据类型。

我们会发现一个问题,就是typeof来判断数据类型其实并不准确。比如数组、正则、日期、对象的typeof返回值都是object,这就会造成一些误差。

2:instance of:
1:instanceof运算符可以用来判断某个构造函数的prototype属性是否存在于另外一个要检测对象的原型链上。
2:instance翻译为实例,因此instanceof的含义就不言而喻,判断该对象是谁的实例,同时我们也就知道instanceof是对象运算符。
3:这里的实例就牵扯到了对象的继承,它的判断就是根据原型链进行搜寻.
4:在对象obj1的原型链上如果存在另一个对象obj2的原型属性,那么表达式(obj1 instanceof obj2)返回值为true;否则返回false。

代码实例:

// 定义构造函数
function C(){} 
function D(){} 

var o = new C();

// true,因为 Object.getPrototypeOf(o) === C.prototype
o instanceof C; 

// false,因为 D.prototype不在o的原型链上
o instanceof D; 

o instanceof Object; // true,因为Object.prototype.isPrototypeOf(o)返回true
C.prototype instanceof Object // true,同上

C.prototype = {};
var o2 = new C();

o2 instanceof C; // true

o instanceof C; // false,C.prototype指向了一个空对象,这个空对象不在o的原型链上.

D.prototype = new C(); // 继承
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true

简单来说,我们使用 typeof 来判断基本数据类型是 ok 的,不过需要注意当用 typeof 来判断 null 类型时的问题,如果想要判断一个对象的具体类型可以考虑用 instanceof,但是 instanceof 也可能判断不准确,比如一个数组,他可以被 instanceof 判断为 Object。所以我们要想比较准确的判断对象实例的类型时,可以采取 Object.prototype.toString.call 方法。

3:toString.call():准确判断对象实例的类型

要想区分对象、数组、函数、单纯使用typeof是不行的。在JS中,可以通过Object.prototype.toString方法,判断某个对象之属于哪种内置类型,分别为null、string、boolean、number、undefined、array、function、object、date、math。

toString()方法用来将数据转化为字符串形式
//基本类型
Object.prototype.toString.call(null); // “[object Null]”
Object.prototype.toString.call(undefined); // “[object Undefined]”
Object.prototype.toString.call(“abc”);// “[object String]”
Object.prototype.toString.call(123);// “[object Number]”
Object.prototype.toString.call(true);// “[object Boolean]”

//函数类型
Function fn(){
console.log(“ajia”);
}
Object.prototype.toString.call(fn); // “[object Function]”

总结:typeof和instanceof都是用来判断变量类型的,两者的区别在于:

1:typeof判断所有变量的类型,返回值有number,boolean,string,function,object,undefined,都是字符串类型。
2:typeof对于丰富的对象实例,只能返回"Object"字符串。
3:instanceof用来判断对象,代码形式为obj1 instanceof obj2(obj1是否是obj2的实例),obj2必须为对象,否则会报错!其返回值为布尔值。
4:instanceof可以对不同的对象实例进行判断,判断方法是根据对象的原型链依次向下查询,如果obj2的原型属性存在obj1的原型链上,(obj1 instanceof obj2)值为true。

参考引用文章:https://www.jianshu.com/p/4ff2332228be