如何准确的判断一个数据的类型(使用Object.prototype.toString.call())
1.typeof:只能判断基本数据类型,不能判断引用数据类型,判断出来的都是Object
2.instanceof:只能进行类型的对比,不能进行类型的判断
3.var arr = [];
console.log(Object.prototype.toString.call(arr));//输出[object Array],是一个数组对象
4.var arr = [];
console.dir(arr);//输出Array(0)
5.Object身上的toString方法与其他对象身上的toString方法不是一个方法,而是其他对象继承Object原型以后改写的toString方法:
var arr = [];
arr.toString()得到的是一个空字符串""
然而Object.prototype.toString.call(arr)输出的是[object Array],说明他俩不是同一个方法
6.在Array.prototype.slice.call(arguments).slice(1)中,arguments本身没有slice方法,所以需要借助call这个方法去借用slice方法。而call方法是用来改变this指向的,也就是说Array此时的指向arguments,所以arguments拥有了slice方法
7.instanceof
function Fn(){
console.log(this instanceof Fn);
}
Fn();//结果为false(说明此时this不指向函数本身,即Fn。因为只是执行一个函数时,this指向window)
如果是new Fn();,则结果为true(说明此时this指向函数本身,即Fn。因为当new一个函数时,this会指向实例化对象,也就是Fn)