最近发现了个判断js数据类型的“终极武器”,Object.prototype.toString.call()。首先来看效果。
//1.判断基本类型:
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]”
//2.判断原生引用类型:
//函数类型
Function fn(){console.log(“test”);}
Object.prototype.toString.call(fn);//”[object Function]”
//日期类型
var date = new Date();
Object.prototype.toString.call(date);//”[object Date]”
// 数组类型
var arr = [1,2,3];
Object.prototype.toString.call(arr);//”[object Array]”
//正则表达式
var reg = /[h]at/g;
Object.prototype.toString.call(reg);//”[object RegExp]”
是不是,js里面的基本数据类型和引用数据类型都已经判断完毕。按理说,Array和Function都有toString()方法,为什么要调用Object原型上的呢,因为他们的toString被改写了。例子如下:
var arr = [1, 2, 3]
arr.toString() // '1,2,3'
var obj = {lang:'zh'}
obj.toString() // '[object Object]'
var fn = function(){}
fn.toString() // 'function(){}'
null.toString() // Cannot read property 'toString' of null
undefined.toString() // Cannot read property 'toString' of undefined
由此可见,虽然这些数组,函数,null...继承了Object里面的属性,但是为了更加简便的开发都做了一些重写。所以要想判断数据类型,就只能用Object.prototype.toString.call(),下面来编写一个完整的判断事件类型的函数。也就比较简单了。
function test(value){
return Object.prototype.toString.call(value).replace('[object ','').replace(']','')
}
接下来说一说,Object.prototype.slice.call()。能将类数组,以及带有length的可遍历的对象转化为数组。上代码.
function test(a,b,c,d)
{
var arg = Array.prototype.slice.call(arguments,1);
console.log(arg);
}
test("a","b","c","d");//[ 'b', 'c', 'd' ]
首先将arguments转化为数组,再让他有slice方法。当然ES6里面的Array.from已经实现了这种操作。以上仅供大家参考,有不正确的欢迎批评指正,一起进步!